home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-085 < prev    next >
Text File  |  1995-12-31  |  91KB  |  2,386 lines

  1. C.S.M.P. Digest             Tue, 21 Feb 95       Volume 3 : Issue 85
  2.  
  3. Today's Topics:
  4.  
  5.         AEGizmos users please read!
  6.         Anyone made a PixPat?
  7.         How is Mac programming REALLY done?
  8.         Mac Primer (Vol 1) source available!!!
  9.         Pascal Programmers Mailing List
  10.         Scroll bar in dialog box
  11.         SndDoCommand at interrupt time
  12.         Using ProcPtrs in Pascal for PPC
  13.         Vertical Text w-o QuickDraw GX
  14.         [Q] Fading a PixMap?
  15.  
  16.  
  17.  
  18. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  19. (pottier@clipper.ens.fr).
  20.  
  21. The digest is a collection of article threads from the internet newsgroup
  22. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  23. regularly and want an archive of the discussions.  If you don't know what a
  24. newsgroup is, you probably don't have access to it.  Ask your systems
  25. administrator(s) for details.  If you don't have access to news, you may
  26. still be able to post messages to the group by using a mail server like
  27. anon.penet.fi (mail help@anon.penet.fi for more information).
  28.  
  29. Each issue of the digest contains one or more sets of articles (called
  30. threads), with each set corresponding to a 'discussion' of a particular
  31. subject.  The articles are not edited; all articles included in this digest
  32. are in their original posted form (as received by our news server at
  33. nef.ens.fr).  Article threads are not added to the digest until the last
  34. article added to the thread is at least two weeks old (this is to ensure that
  35. the thread is dead before adding it to the digest).  Article threads that
  36. consist of only one message are generally not included in the digest.
  37.  
  38. The digest is officially distributed by two means, by email and ftp.
  39.  
  40. If you want to receive the digest by mail, send email to listserv@ens.fr
  41. with no subject and one of the following commands as body:
  42.     help                                Sends you a summary of commands
  43.     subscribe csmp-digest Your Name     Adds you to the mailing list
  44.     signoff csmp-digest                 Removes you from the list
  45. Once you have subscribed, you will automatically receive each new
  46. issue as it is created.
  47.  
  48. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  49. Questions related to the ftp site should be directed to
  50. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  51. digest are available there.
  52.  
  53. Also, the digests are available to WAIS users.  To search back issues
  54. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  55. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  56.  
  57.  
  58. -------------------------------------------------------
  59.  
  60. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  61. Subject: AEGizmos users please read!
  62. Date: Fri, 27 Jan 1995 19:01:12 GMT
  63. Organization: Apple Computer, Inc.
  64.  
  65. I have some good news and some mixed news for users of AEGizmos. (AEGizmos
  66. is a library I wrote, available on the Developer CD, that provides an
  67. alternate API for packing/unpacking Apple Event descriptors. It's faster
  68. and in many cases more convenient than the regular API.)
  69.  
  70. The good news: The Apple Event Manager is being rewritten for the Copland
  71. system release and they're planning to roll in much of the functionality
  72. from the Gizmos.
  73.  
  74. The mixed news: The data format of Apple Event compound descriptors
  75. (lists, records, events) is changing in Copland. This will make operations
  76. on them much more efficient (good) but will break code that uses existing
  77. versions of the Gizmos (bad) since the Gizmos code gropes the internals of
  78. the descriptors.
  79.  
  80. To help with the transition, I'm going to release a new version of the
  81. Gizmos (incorporating some minor bug fixes) as a shared library. I hope to
  82. get this out on the next developer CD, and will also see about uploading
  83. it to Apple's FTP site.
  84. By using the shared library, you can continue to use the AEGizmos API
  85. while assuring future compatibility with Copland, since in Copland we can
  86. just rev the library to use the new AEM structures and API.
  87.  
  88. The Copland team want to know who is using AEGizmos, especially in
  89. commercial products. Please send mail to Dan_Clifford@powertalk.apple.com
  90. and let him know which parts of the Gizmos you're using, for what type of
  91. product. I'm sure he'd also be interested in your feedback on the Gizmos
  92. API and how it could be merged with the Apple Event Manager. CC me too,
  93. please!
  94.  
  95.  
  96. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  97.                                               OpenDoc info: FTP to cil.org
  98.  
  99.          Visit Scenic Flood Control Dam No. 3.      
  100.  
  101. +++++++++++++++++++++++++++
  102.  
  103. >From paitech@hntp2.hinet.net (Pai Technology)
  104. Date: 2 Feb 1995 14:32:25 GMT
  105. Organization: HiNet
  106.  
  107. Jens Alfke (jens_alfke@powertalk.apple.com) wrote:
  108. : To help with the transition, I'm going to release a new version of the
  109. : Gizmos (incorporating some minor bug fixes) as a shared library. I hope to
  110. : get this out on the next developer CD, and will also see about uploading
  111. : it to Apple's FTP site.
  112.  
  113. How about the licensing policy of this shared library?  Is the license
  114. covered by MacOS SDK?  Do we have to pay a separate annual fee to Apple in
  115. order to distribute this shared library with each of our products?
  116.  
  117. I think this kind of legal stuff is a bit annoying.
  118.  
  119.  
  120. Hao-yang Wang
  121. Pai Technology, Inc.
  122. Taipei
  123.  
  124. +++++++++++++++++++++++++++
  125.  
  126. >From muttbovine@aol.com (MuttBovine)
  127. Date: 4 Feb 1995 01:33:14 -0500
  128. Organization: America Online, Inc. (1-800-827-6364)
  129.  
  130. >I think this kind of legal stuff is a bit annoying.
  131.  
  132. Yeah, laws suck. Let's repeal them all.
  133.  
  134. +++++++++++++++++++++++++++
  135.  
  136. >From neeri@iis.ee.ethz.ch (Matthias Neeracher)
  137. Date: 06 Feb 1995 16:16:43 GMT
  138. Organization: Integrated Systems Laboratory, ETH, Zurich
  139.  
  140. In article <jens_alfke-2701951100410001@jensothermac.apple.com>, jens_alfke@powertalk.apple.com (Jens Alfke) writes:
  141. > To help with the transition, I'm going to release a new version of the
  142. > Gizmos (incorporating some minor bug fixes) as a shared library.
  143.  
  144. This is all wonderful for the PowerPC, but which shared library format do you
  145. intend to use on 68K Macs? If it's ASLM, then AEDisposeDesc(AEGizmos) for
  146. me. If it's CFM-68K, it will at least be a major inconvenience.
  147.  
  148. Hmmm... Copland *will* appear on both PowerPC and 68K Macs, will it? :-)
  149.  
  150. Please don't take this as a criticism of your fine work on AEGizmos.
  151.  
  152. Matthias
  153.  
  154. - ---
  155. Matthias Neeracher <neeri@iis.ee.ethz.ch> http://err.ethz.ch/members/neeri.html
  156.    "I'm set free to find a new illusion" -- Velvet Underground
  157.  
  158. ---------------------------
  159.  
  160. >From phixus@netcom.com (Chris DeSalvo)
  161. Subject: Anyone made a PixPat?
  162. Date: Tue, 24 Jan 1995 09:30:50 GMT
  163. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  164.  
  165. I've been trying desperately to do one of two things:
  166.  
  167.         Locate a utility that can convert a PICT to a 'ppat' resource
  168.         with 256x256 dimensions and a custom color table,
  169.  
  170.                 or
  171.  
  172.         Write the damn thing myself.  Tried this approach:
  173.                 Load the PICT, draw it into a GWorld.
  174.                 Call NewPixPat
  175.                 Call CopyPixMap from the GWorld's portPixMap to the
  176.                         PixPat's patMap
  177.  
  178.         Nothing returns an error but when I go to do a FillCRect with
  179.         my new PixPat I get garbage.
  180.  
  181. IM:Imaging with Quickdraw just sort of breezes over the fact that you
  182. can make a PixPat but never actually explains how.
  183.  
  184. Any help appreciated,
  185. Thanx,
  186. Chris
  187. -- 
  188. +-----------------------------------------------------------------+
  189. | phixus@netcom.com           |   Macintosh:  Changing the world, |
  190. | Chris De Salvo              |        one person at a time!      |
  191. | Professional Mac Geek       |    -----------------------------  |
  192. | for MacPlay, Inc.           |      (I wish they'd hurry up!)    |
  193. +-----------------------------------------------------------------+
  194.  
  195. Any opinions expressed, or implied, are my own!  They should not be
  196. considered representative of the opinions or policies of my employer,
  197. MacPlay, a division of Interplay Productions, Inc.
  198.  
  199. +++++++++++++++++++++++++++
  200.  
  201. >From kenlong@netcom.com (Ken Long)
  202. Date: Tue, 24 Jan 1995 16:34:10 GMT
  203. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  204.  
  205. Chris DeSalvo (phixus@netcom.com) wrote:
  206. : I've been trying desperately to do one of two things:
  207.  
  208. :       Locate a utility that can convert a PICT to a 'ppat' resource
  209. :       with 256x256 dimensions and a custom color table,
  210.  
  211. I think DeskTextures does 256 square patterns.
  212.  
  213. :               or
  214.  
  215. :       Write the damn thing myself.  Tried this approach:
  216. :               Load the PICT, draw it into a GWorld.
  217. :               Call NewPixPat
  218. :               Call CopyPixMap from the GWorld's portPixMap to the
  219. :                       PixPat's patMap
  220.  
  221. Maybe the author would clue you as to how he did it.
  222.  
  223. -Ken-
  224.  
  225. +++++++++++++++++++++++++++
  226.  
  227. >From phixus@netcom.com (Chris DeSalvo)
  228. Date: Wed, 25 Jan 1995 08:54:04 GMT
  229. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  230.  
  231. Ok, I figured out how to do it.  The following is a BinHex'd
  232. CodeWarrior 5 .c file of my final function.  It takes a PICT resource
  233. and moves all of the pixel data and the color table of the PICT into a
  234. new PixPatHandle.  I had to read the section in IM:Quickdraw about a
  235. dozen times to figure it out.  You get it for free...
  236.  
  237.  
  238. -- end
  239.  
  240. L8R
  241. Chris
  242. -- 
  243. +-----------------------------------------------------------------+
  244. | phixus@netcom.com           |   Macintosh:  Changing the world, |
  245. | Chris De Salvo              |        one person at a time!      |
  246. | Professional Mac Geek       |    -----------------------------  |
  247. | for MacPlay, Inc.           |      (I wish they'd hurry up!)    |
  248. +-----------------------------------------------------------------+
  249.  
  250. Any opinions expressed, or implied, are my own!  They should not be
  251. considered representative of the opinions or policies of my employer,
  252. MacPlay, a division of Interplay Productions, Inc.
  253.  
  254. +++++++++++++++++++++++++++
  255.  
  256. >From ivanski@world.std.com (Ivan M CaveroBelaunde)
  257. Date: Wed, 25 Jan 1995 15:10:46 GMT
  258. Organization: The World Public Access UNIX, Brookline, MA
  259.  
  260. phixus@netcom.com (Chris DeSalvo) writes:
  261. >I've been trying desperately to do one of two things:
  262.  
  263. >       Locate a utility that can convert a PICT to a 'ppat' resource
  264. >       with 256x256 dimensions and a custom color table,
  265.  
  266. >               or
  267.  
  268. >       Write the damn thing myself.  Tried this approach:
  269. >               Load the PICT, draw it into a GWorld.
  270. >               Call NewPixPat
  271. >               Call CopyPixMap from the GWorld's portPixMap to the
  272. >                       PixPat's patMap
  273.  
  274. >       Nothing returns an error but when I go to do a FillCRect with
  275. >       my new PixPat I get garbage.
  276.  
  277. I'm not sure if this is the problem (I wasn't using the code in question
  278. to create PixPats, and I believe there's something special about PixPat
  279. organization in memory, such as bit packing and some of the flags in
  280. the pixpat struct), but doing CopyPixMap from GWorlds is potentially
  281. problematic: GWorld pixmaps are "special": their pmVersion field can contain
  282. formally undocumented values, which denote whether the pixmap's baseaddress
  283. is a handle or a pointer to a locked handle. The pmVersion then changes
  284. value whenever you change the locked state of the gworlds's pixels; normally
  285. the pmVersion is (I think) 2, denoting a handle for baseAddr, and when you
  286. call LockPixels the handle gets locked, the dereffed handle gets stuffed
  287. into the baseAddr, and pmVersion changes to 1, denoting a locked pixmap.
  288.  
  289. You might want to look into the snippets on the developer CDs, I seem to
  290. remember a "pixmap to pixpat to ppat" snippet on it.
  291.  
  292. HTH,
  293.  
  294. -Ivan
  295. - -
  296. Ivan Cavero Belaunde (ivanski@world.std.com, ivan_cavero-belaunde@avid.com)
  297. Avid VideoShop Lead
  298. Avid Technology, Inc.
  299.  
  300.  
  301.  
  302.  
  303.  
  304. +++++++++++++++++++++++++++
  305.  
  306. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  307. Date: Thu, 26 Jan 1995 18:34:28 GMT
  308. Organization: Apple Computer, Inc.
  309.  
  310. > phixus@netcom.com (Chris DeSalvo) writes:
  311. > >I've been trying desperately to do one of two things:
  312. > >       Locate a utility that can convert a PICT to a 'ppat' resource
  313. > >       with 256x256 dimensions and a custom color table,
  314. > >               or
  315. > >       Write the damn thing myself.  Tried this approach:
  316. > >               Load the PICT, draw it into a GWorld.
  317. > >               Call NewPixPat
  318. > >               Call CopyPixMap from the GWorld's portPixMap to the
  319. > >                       PixPat's patMap
  320. > >       Nothing returns an error but when I go to do a FillCRect with
  321. > >       my new PixPat I get garbage.
  322.  
  323. 1. You need to set up the PixPat's pixel storage first -- resize it, lock
  324. it down, point the baseAddr in the PixMap to it -- before you do the
  325. copyBits.
  326. 2. Remember to call PixPatChanged (or is that ChangedPixPat?) afterwards.
  327. 3. Did you set up the PixPat's color table first?
  328.  
  329.  
  330. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  331.                                               OpenDoc info: FTP to cil.org
  332.  
  333.          Visit Scenic Flood Control Dam No. 3.      
  334.  
  335. +++++++++++++++++++++++++++
  336.  
  337. >From Roy@AdeptSolutions.com (Roy Lovejoy)
  338. Date: Sun, 5 Feb 1995 07:47:36 GMT
  339. Organization: Adept Solutions
  340.  
  341. One thing that I found, when I did *MY* desktop pattern editor, (three
  342. years BEFORE Wall Paper, I might point out :), is that the PixPat's
  343. storage has to be exact, i.e. 256 x 256 at 8 bit needs to have 65536
  344. bytes. If you are of the anal type programmer, you might have already
  345. noticed that you get bonus bytes in your (**pixmaphandle).rowBytes, that
  346. belong to GWorlds, EVEN IF YOU ARE AT A POWER OF TWO. So in the 256 x 256
  347. 8 bit case, you might see 260 for your row bytes. 
  348.  
  349. I had to dupe the GWorlds's baseAddr to get a handle I could shrink, then
  350. Munger() the (rowBytes-width) off of each line. *THAT* data could then be
  351. used in a ppat.
  352. - -------------------------------------------------------------------
  353. Roy Lovejoy          PHONE: 619.727.6825  INET:roy@AdeptSolutions.com
  354. Pixel PooBah           FAX: 619.727.5869   ALINK: ............. adept
  355. Adept Solutions      PTALK                   CIS: ........ 72447,1447
  356. 524 Avenida Verde       DD: 619.598.5225  eWorld: ........ adeptsolns
  357. San Marcos CA 92069                          AOL: ........ adeptsolns
  358. - -------------------------------------------------------------------
  359.  
  360. +++++++++++++++++++++++++++
  361.  
  362. >From h+@metrowerks.com (Jon W{tte)
  363. Date: Sun, 05 Feb 1995 10:14:05 +0100
  364. Organization: The Conspiracy
  365.  
  366. In article <jens_alfke-2601951033560001@jensothermac.apple.com>,
  367. jens_alfke@powertalk.apple.com (Jens Alfke) wrote:
  368.  
  369. >> >               Load the PICT, draw it into a GWorld.
  370.  
  371. Did you lock the GWorld before drawing into it or copying out 
  372. of it?
  373.  
  374. Cheers,
  375.  
  376.                                                         / h+
  377.  
  378.  
  379. --
  380.   Jon Wdtte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  381.  
  382. "If you want to see a pipelined execution model, go to a laundromat."
  383.       Richard Clark
  384.  
  385.  
  386. ---------------------------
  387.  
  388. >From wakew@jingluo.cs.vt.edu (William Wake)
  389. Subject: How is Mac programming REALLY done?
  390. Date: 30 Jan 1995 16:05:11 GMT
  391. Organization: Virginia Tech, Blacksburg, Virginia
  392.  
  393. I've just come "back" to trying to program the Mac, and have worked my way  
  394. through Sydow's _Macintosh Programming Techniques_. (I liked this book, by the  
  395. way.)
  396.  
  397. I appreciate the resource-based approach the Mac uses, but some of the  
  398. techniques in the book just don't seem like they'd scale up, so I'm curious  
  399. what you really do.
  400.  
  401. + Resources are mapped to the program by a bunch of #define's. This seems like  
  402. it would get out of hand in a program with a realistic set of resources.
  403.  
  404. + The book's approach to event handling is to take each event and decode where  
  405. it will go. This is trivial when you only have a window or two, but not so  
  406. maintainable when there are many.
  407.  
  408. + Things like writing in color or black-and-white are sprinkled all over the  
  409. code. ("if (color_system) {do-it-one-way} else {do-it-another}")
  410.  
  411. + Do real apps use TCL or PowerPlant? Do those tools handle much of the  
  412. event-to-object mapping? (I'm used to NeXT's Interface Builder, where that's  
  413. done in a more integrated way than what I've seen on the Mac.)
  414.  
  415. Now, I realize an intro book is lucky to introduce the basics in a satisfactory  
  416. way, much less address issues of scaling up and maintaining large programs. 
  417.  
  418. So, what do you REALLY do?
  419.  
  420.         Bill Wake
  421.         Virginia Tech
  422.  
  423. +++++++++++++++++++++++++++
  424.  
  425. >From altura@aol.com (ALTURA)
  426. Date: 31 Jan 1995 04:47:31 -0500
  427. Organization: America Online, Inc. (1-800-827-6364)
  428.  
  429. > + Resources are mapped to the program by a bunch of #define's. This
  430. seems like  
  431. > it would get out of hand in a program with a realistic set of resources.
  432.  
  433. That's how I do it.  Although, I now think enums are a better choice.
  434.  
  435. > The book's approach to event handling is to take each event and decode
  436. where  
  437. > it will go. This is trivial when you only have a window or two, but not
  438. so  
  439. > maintainable when there are many.
  440.  
  441. Some sort of general event handling scheme is better in this case.  I
  442. usually associate some generalized handlers (i.e. for click, update, etc.)
  443. with every window and then let the window's handler decide what to do.
  444.  
  445. > Things like writing in color or black-and-white are sprinkled all over
  446. the  
  447. > code. ("if (color_system) {do-it-one-way} else {do-it-another}")
  448.  
  449. I do it this way as well.  However, in future large projects I'll probably
  450. generalize drawing with some sort of device driver metaphor so that I
  451. don't have to do all that if'ing.
  452.  
  453. > Do real apps use TCL or PowerPlant? Do those tools handle much of the  
  454. > event-to-object mapping? (I'm used to NeXT's Interface Builder, where
  455. that's  
  456. > done in a more integrated way than what I've seen on the Mac.)
  457.  
  458. I've never used a third-part framework.
  459.  
  460. I'm curious about others' experiences.
  461.  
  462. -Jordan
  463.  
  464. +++++++++++++++++++++++++++
  465.  
  466. >From pottier@triere.ens.fr (Francois Pottier)
  467. Date: 31 Jan 1995 11:27:03 GMT
  468. Organization: Ecole Normale Superieure, PARIS, France
  469.  
  470. In article <3gj2nn$qon@server.cs.vt.edu>,
  471. William Wake <wakew@jingluo.cs.vt.edu> wrote:
  472.  
  473. >+ Resources are mapped to the program by a bunch of #define's. This seems like  
  474. >it would get out of hand in a program with a realistic set of resources.
  475. You're right. I only write medium-sized programs and yet my resource
  476. management is quite messy. I have to be very careful to check that my
  477. #define's and my resources don't get out of sync. I wish the development
  478. environment would do something about it (are you listening, MetroWerks?)
  479.  
  480.  
  481. -- 
  482. Francois Pottier                                            pottier@dmi.ens.fr
  483. - ----------------------------------------------------------------------------
  484. Check my WWW page at http://acacia.ens.fr:8080/home/pottier/index.html ...
  485.  
  486. +++++++++++++++++++++++++++
  487.  
  488. >From oster@netcom.com (David Phillip Oster)
  489. Date: Tue, 31 Jan 1995 12:48:24 GMT
  490. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  491.  
  492. In article <3gl6q7$plh@nef.ens.fr> pottier@triere.ens.fr (Francois Pottier) writes:
  493. _>In article <3gj2nn$qon@server.cs.vt.edu>,
  494. _>William Wake <wakew@jingluo.cs.vt.edu> wrote:
  495.  
  496. _>>+ Resources are mapped to the program by a bunch of #define's. This seems like  
  497. _>>it would get out of hand in a program with a realistic set of resources.
  498.  
  499. _>You're right. I only write medium-sized programs and yet my resource
  500. _>management is quite messy. I have to be very careful to check that my
  501. _>#define's and my resources don't get out of sync. I wish the development
  502. _>environment would do something about it (are you listening, MetroWerks?)
  503.  
  504. There is a trick to it:
  505. 1.) define your resources in the Rez language (as supported by MPW, THINK C,
  506.         and ToolServer==MPW)
  507. 2.) write a file called, say Rez.h, that only contains #defines,
  508. for example:
  509. /* MENU resources
  510.  */
  511. #define kAppleMenu              128
  512. #define kFileMenu               kAppleMenu+1
  513. #define kEditMenu               kFileMenu+1
  514.  
  515. then include it in both your .c files and your .r files.
  516. Similarly, including comments for each item in your DITLs and STR#s that
  517. gives the enum by which that item is known in C is a good way to avoid
  518. getting out of sync.
  519. -- 
  520. - ------- oster@netcom.com ----------
  521. There is no sight finer than that of the planet Earth in your rearview mirror.
  522.  
  523.  
  524.  
  525. +++++++++++++++++++++++++++
  526.  
  527. >From first.ascent@mindlink.bc.ca (Alex Curylo)
  528. Date: 31 Jan 1995 19:53:22 GMT
  529. Organization: First Ascent
  530.  
  531. In article <3gl6q7$plh@nef.ens.fr>
  532. pottier@triere.ens.fr (Francois Pottier) writes:
  533.  
  534. > You're right. I only write medium-sized programs and yet my resource
  535. > management is quite messy. I have to be very careful to check that my
  536. > #define's and my resources don't get out of sync.
  537.  
  538. What most people I know do is use common Rez and program headers,
  539. usually with a .r.h or .common.h (as in AppsToGo) suffix. That makes it
  540. easy enough
  541. that I really haven't noticed this as being a problem.
  542.  
  543. If it makes you feel any better, Windows programs don't seem to have
  544. any more elegant way to deal with this, at least not the ones I port.
  545.  
  546. Alex Curylo  first.ascent@mindlink.bc.ca  (604)451-5323, fax -1359
  547. ***  First Ascent: Mac programming, UP paragliders, indie CDs  ***
  548.  
  549. +++++++++++++++++++++++++++
  550.  
  551. >From sardaukar@aol.com (Sardaukar)
  552. Date: 31 Jan 1995 21:25:15 -0500
  553. Organization: America Online, Inc. (1-800-827-6364)
  554.  
  555. 1) Resource management is just experience.  A large program will typically
  556. have a lot of resources, of both standard and custom types.  All you have
  557. to do is bull your way through a big project once, and you'll come up with
  558. a way that works good for you.
  559.  
  560. 2) Event handling is much the same.  It's very very easy to just switch
  561. down through event types and through the various windows and such. Don't
  562. get too hung up on one person's technique for this.  Some people have
  563. structs for each window with proc ptrs to the event handlers, some have a
  564. massive switch statement.  Do whatever is easiest for you and your
  565. asociates to *read* and *follow*. 
  566.  
  567. 3) Things like color/b&w, stereo/mono, 1 bit/8/bit/16/bit/24bit, gray
  568. palette/system pallette, scsi4.3/old scsi... etc.  Handling all of these
  569. issues is the responsibility of the product designer. Your product is
  570. obliged to handle the current operating environment in the most
  571. Macintosh-friendly way. The Macintosh makes it ridiculously easy to
  572. determine what features are available, what state the System is in, etc.
  573. Then you take the appropriate action.  That's a big difference between the
  574. Macintosh and that other piece-of-crap industry.
  575.  
  576. examples: 
  577. - your program should display and draw in a manner appropriate for the
  578. pixel depth of the monitor your windows are on
  579. - your program should enable/disable controls as appropriate for what
  580. features are available.
  581. - your program should determine at startup what major features are
  582. required to operate and quit gracefully if the current operating
  583. enviroment is inadequate.
  584. - your program should never make assumptions about the contents of the
  585. System or a particular mac model but should test for specific features.
  586.  
  587. All of this kind of stuff is all over Inside Macintosh.  I suggest you
  588. look at Apple's sample code for examples as well
  589.  
  590. 4) Some people *do* use frameworks - some don't.  In many instances a
  591. framework is inappropriate.  Also, some frameworks suck.  You have to be
  592. careful in selecting one.  A beginner should always code things "by hand".
  593.  Then ater a couple of major projects you can move to a framework if you
  594. find one you like (PowerPlant is pretty good).  However, the game is
  595. changing rapidly.  With the advent of OpenDoc, the small developer will
  596. gain an advantage by using the OpenDoc development framework.  For now
  597. just write code.
  598.  
  599. +++++++++++++++++++++++++++
  600.  
  601. >From woody@alumni.cco.caltech.edu (William Edward Woody)
  602. Date: Wed, 01 Feb 1995 13:00:08 -0800
  603. Organization: In Phase Consulting
  604.  
  605. In article <3gj2nn$qon@server.cs.vt.edu>, wakew@jingluo.cs.vt.edu (William
  606. Wake) wrote:
  607.  
  608. > I've just come "back" to trying to program the Mac, and have worked my way  
  609. > through Sydow's _Macintosh Programming Techniques_. (I liked this book,
  610. by the  
  611. > way.)
  612. > I appreciate the resource-based approach the Mac uses, but some of the  
  613. > techniques in the book just don't seem like they'd scale up, so I'm curious  
  614. > what you really do.
  615. > + Resources are mapped to the program by a bunch of #define's. This
  616. seems like  
  617. > it would get out of hand in a program with a realistic set of resources.
  618.  
  619. Actually the resource-based approach scales nicely. I tend to isolate the
  620. accessor functions which access a particular resource into a single function
  621. (for those resources which the Macintosh OS doesn't provide an accessor
  622. function for me), and I wind up putting all of the #define's into a
  623. single 'resource.h' file. A typical 'resource.h' file for a typical
  624. program winds up being several hundreds of lines. On the other hand,
  625. you can group those '#defines' into groups; all of the cursors go after
  626. the /* CURSORS */ comment, all of the menus go after the /* MENUS */, etc.
  627.  
  628. > + The book's approach to event handling is to take each event and decode
  629. where  
  630. > it will go. This is trivial when you only have a window or two, but not so  
  631. > maintainable when there are many.
  632.  
  633. I personally do two things.
  634.  
  635. (1) I use the 'windowKind' field in the WindowRecord to determine the
  636. general class of window I'm dealing with (floating window, drawing window,
  637. etc.)
  638.  
  639. (2) I put a pointer to my application's data structures (in this case,
  640. the pointer to my TWindow record) into the window's refCon field.
  641.  
  642. My inner event loop looks almost exactly like the code in the book, except
  643. that my individual event handler routines (DoUpdate, DoActivate) gets
  644. the TWindow record which contains my data, looks up the windowKind field,
  645. and switches to the correct DoUpdateXXX routine depending on the
  646. contents of the windowKind field.
  647.  
  648. > + Things like writing in color or black-and-white are sprinkled all over the  
  649. > code. ("if (color_system) {do-it-one-way} else {do-it-another}")
  650.  
  651. Yep, it's really done this way. The best way to do it is to write it as
  652. if you are in a black and white system, except mark those things that
  653. I would like in color with a /* ###C */ comment. Then I add color by
  654. doing a global search for '###C', and add in the color code I wanted to
  655. add, using the if statement you've got above.
  656.  
  657. > + Do real apps use TCL or PowerPlant? Do those tools handle much of the  
  658. > event-to-object mapping? (I'm used to NeXT's Interface Builder, where that's  
  659. > done in a more integrated way than what I've seen on the Mac.)
  660.  
  661. I don't, but a lot of people do. I *do* use an application interface
  662. class; one that I wrote myself.
  663.  
  664. These things *do* do all of the event to object mapping for you; that
  665. is their biggest strength.
  666.  
  667. For example, if you have a window class called TWindow, with a method
  668. called 'DoUpdate' in C++, your DoUpdate routine looks like:
  669.  
  670.         DoUpdate(WindowPtr w)
  671.         {
  672.             TWindow *tw;
  673.  
  674.             // map window record to window pointer
  675.             tw = GetTWindow(w);
  676.  
  677.             // Do the update process, calling the window class's drawing code
  678.             BeginUpdate(w);
  679.             SetPort(w);
  680.  
  681.             tw->DoUpdate();
  682.  
  683.             EndUpdate(w);
  684.         }
  685.  
  686.  
  687. > Now, I realize an intro book is lucky to introduce the basics in a
  688. satisfactory  
  689. > way, much less address issues of scaling up and maintaining large programs. 
  690. > So, what do you REALLY do?
  691.  
  692. The most important thing to do is to have a programming style and convention
  693. which makes your source code consistant across modules. This allows you
  694. to maintain *any* large program without getting confused.
  695.  
  696. What I do is use the following:
  697.  
  698. ALL functions begin with a comment of the format:
  699.  
  700.         /*  function_name
  701.          *
  702.          *       Description of function_name goes here. Enough
  703.          *  information is placed here to figure out what the function
  704.          *  does without ever having to actually look at the code.
  705.          */
  706.  
  707. I use a mixed-case style of naming functions. For example, 'FunctionName'.
  708. However, this can be confused with Apple's naming convention, and using
  709. '_'-deliminated function names may make sense, for example, 'function_name'.
  710.  
  711. Variables local to a scope (local to a structure, local to a class,
  712. local to a function) all start with a lower-case charager; ie, 'localPoint'.
  713.  
  714. Variables global in scope start with an upper-case 'G' character; ie,
  715. 'GMyPoint', 'GGlobalPoint'. (Even though 'Global' begins with an upper-case
  716. 'G', the separate upper-case 'G' is required, as the G in Global is part
  717. of Global. No fair being tricky; it's only you who you are fooling.)
  718.  
  719. Constants begin with a capital 'K'; 'KMaxLines'.
  720.  
  721. Variables which are static scoped (which survive across function invocations
  722. or are static in classes) begin with a lower-case 'g'; ie, 'gWindowList'.
  723.  
  724. Classes begin with a capital 'T'; mix-in classes begin with a 'M'. (Mixin
  725. classes are classes which are never expected to be used to create an
  726. object, but only add functionality to an existing class hierarchy. For
  727. example, I have a mix-in class which provides 'undo' functionality to
  728. an editor which uses linked-list objects. It's a mix-in class, because
  729. from 'undo' functionality one does not create an object.)
  730.  
  731. And so forth.
  732.  
  733.  
  734. This may seem stupid, but when you are starting to write programs with
  735. around 100,000 lines of code in the main application, having a constant
  736. way of writing your code helps a great deal in keeping track of all of
  737. the information.
  738.  
  739. Remember, the only difference between a big program and a small program
  740. is that a big program is a lot larger, and thus harder to keep in your
  741. brain all at once. Having a constant programming style allows you to
  742. in a sense 'swap' code out of your brain and onto the page, without making
  743. the process of 'swapping' the code back in difficult.
  744.  
  745. Ever try to go back and read old code that you wrote two or three years
  746. ago? It's like reading the code of a stranger, unless you have a
  747. constant style.
  748.  
  749.                                                         - Bill
  750.  
  751. -- 
  752. William Edward Woody     |  e-mail: woody@alumni.cco.caltech.edu
  753. In Phase Consulting      |  WWW:    http://alumni.caltech.edu/~woody
  754. 337 West California #4   |  Fax:    (818) 502-1467
  755. Glendale, CA 91203       |  ICBM:   N:34.4' W:118.15'
  756.  
  757. +++++++++++++++++++++++++++
  758.  
  759. >From wakew@jingluo.cs.vt.edu (William Wake)
  760. Date: 1 Feb 1995 15:23:44 GMT
  761. Organization: Virginia Tech, Blacksburg, Virginia
  762.  
  763. In article <3gmreb$cml@newsbf02.news.aol.com> sardaukar@aol.com (Sardaukar)  
  764. writes:
  765. > 3) Things like color/b&w....
  766. > Handling all of these issues is the responsibility 
  767. > of the product designer.
  768.  
  769. My question was not so much WHETHER to handle them as HOW to handle them. I was
  770. curious if people really write their code like this:
  771.         if (system_is_color) {
  772.                 do it the color way
  773.         } else {
  774.                 do it the b/w way
  775.         }
  776.  
  777. Or rather, do they set up "intermediaries" in a sort of OO way, perhaps setting
  778. up pointers to functions or building up a generic "screen_manager" type object
  779. that does its own tracking of screen depth.
  780.  
  781. What I'm getting at is that I haven't seen a lot of Mac code, but  a lot of
  782. what I've seen hasn't been all that great-looking from a maintenance point of
  783. view.
  784.  
  785.         Bill Wake
  786.         wakew@cs.vt.edu
  787.  
  788. +++++++++++++++++++++++++++
  789.  
  790. >From D.Birnie@Regy.Canterbury.ac.NZ (Denis Birnie)
  791. Date: Thu, 02 Feb 1995 11:11:09 +1200
  792. Organization: Information Services, University of Canterbury
  793.  
  794. >My question was not so much WHETHER to handle them as HOW to handle them. I was
  795. >curious if people really write their code like this:
  796. >
  797. >        if (system_is_color) {
  798. >                do it the color way
  799. >        } else {
  800. >                do it the b/w way
  801. >        }
  802. >
  803. >Or rather, do they set up "intermediaries" in a sort of OO way, perhaps setting
  804. >up pointers to functions or building up a generic "screen_manager" type object
  805. >that does its own tracking of screen depth.
  806. >
  807. At some point you have to have code like that above, whether it's...
  808.  * high-up and called just once to determine which functions to call later
  809.  * low-down in the actual draw-stuff code (library routines)
  810.  * or springled all through the code
  811. ...is up to you (of course the third option wouldn't be terribly smart)
  812.  
  813. I take option 2 in order to keep as much of the code as common as
  814. possible.  For example to draw the background (pattern) in a window I
  815. might do this...
  816.  
  817.   FancyBackground();
  818.   DrawBitOfBackGround(&theBit);
  819.   PlainBackground();
  820.  
  821. Where FancyBackground is defined like...
  822.  
  823. void FancyBackground( void )
  824. {
  825.    if (OffWorldIsColour) ForeColor(greenColor);
  826.    if (FancyBackgroundPat != NIL) {
  827.       HLock((Handle) FancyBackgroundPat);
  828.       BackPixPat(FancyBackgroundPat);
  829.    };
  830. }
  831.  
  832. This handles three cases...
  833.  * B/W   - just draw a gray pattern
  834.  * <4bit - just draw a gray pattern, but in green
  835.  * 4+bit - use a colour pattern (PPAT)
  836.  
  837. This works for me - it's perhaps not optimal but it does go.
  838.  
  839. Denis
  840. -- 
  841. The above in no way reflects the opinion or standards of...
  842.  - the University of Canterbury
  843.  - the doctors who give me my medication
  844.  - myself, five minutes from now, then, tomorrow or yesterday...
  845.                               (depending on your timezone :-)
  846. - --
  847.  
  848. +++++++++++++++++++++++++++
  849.  
  850. >From sardaukar@aol.com (Sardaukar)
  851. Date: 1 Feb 1995 23:45:44 -0500
  852. Organization: America Online, Inc. (1-800-827-6364)
  853.  
  854. what you do for drawing in ports is use DeviceLoop().  See "Inside
  855. Macintosh: Imaging with QuickDraw" for more.
  856.  
  857. +++++++++++++++++++++++++++
  858.  
  859. >From sardaukar@aol.com (Sardaukar)
  860. Date: 1 Feb 1995 23:50:12 -0500
  861. Organization: America Online, Inc. (1-800-827-6364)
  862.  
  863. Look, kids, listen to this William Woody guy.  He's got it *right on the
  864. money*.  If I still had a company I'd offer him a job. Although I'd needle
  865. him about the "_" underscores. 
  866.  
  867. 'Nuff said.
  868.  
  869.  
  870. +++++++++++++++++++++++++++
  871.  
  872. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  873. Date: 2 Feb 1995 09:12:48 GMT
  874. Organization: (none)
  875.  
  876. altura@aol.com (ALTURA) writes:
  877.  
  878. >> + Resources are mapped to the program by a bunch of #define's. This
  879. >seems like  
  880. >> it would get out of hand in a program with a realistic set of resources.
  881.  
  882. >That's how I do it.  Although, I now think enums are a better choice.
  883.  
  884. Big deal - anything that defines constants, so we can write kGeneralAlert
  885. instead of 128. #define, enum, Pascal's const (which I use), what's the
  886. difference?
  887.  
  888. >> The book's approach to event handling is to take each event and decode
  889. >where  
  890. >> it will go. This is trivial when you only have a window or two, but not
  891. >so  
  892. >> maintainable when there are many.
  893.  
  894. >Some sort of general event handling scheme is better in this case.  I
  895. >usually associate some generalized handlers (i.e. for click, update, etc.)
  896. >with every window and then let the window's handler decide what to do.
  897.  
  898. I use TransSkel. For small programs, I use a plug-in event loop that goes
  899. between the main program and a set of application-dependent event handlers.
  900. The event loop itself should not be cluttered with application-dependent
  901. tasks.
  902.  
  903. >> Things like writing in color or black-and-white are sprinkled all over
  904. >the  
  905. >> code. ("if (color_system) {do-it-one-way} else {do-it-another}")
  906.  
  907. >I do it this way as well.  However, in future large projects I'll probably
  908. >generalize drawing with some sort of device driver metaphor so that I
  909. >don't have to do all that if'ing.
  910.  
  911. I write glue code for the more common cases, PlotCIcon, for example (which
  912. definitely lets itself be implemented in a non-color version).
  913.  
  914. --
  915. - -
  916. Ingemar Ragnemalm, PhD
  917. Image processing, Mac shareware games
  918. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  919.  
  920. +++++++++++++++++++++++++++
  921.  
  922. >From pottier@triere.ens.fr (Francois Pottier)
  923. Date: 2 Feb 1995 11:07:47 GMT
  924. Organization: Ecole Normale Superieure, PARIS, France
  925.  
  926. In article <woody-0102951300080001@192.0.2.1>,
  927. William Edward Woody <woody@alumni.cco.caltech.edu> wrote:
  928.  
  929. >function for me), and I wind up putting all of the #define's into a
  930. >single 'resource.h' file. A typical 'resource.h' file for a typical
  931. >program winds up being several hundreds of lines.
  932.  
  933. That's what I did do, but it's a pain because adding a single resource
  934. means recompiling all files that use resources, that is almost the whole
  935. project (10 minutes on my IIci).
  936.  
  937. On the other hand, if each file has its own resource definitions, resource
  938. ID conflicts are hard to avoid. It looks like it's a problem without a good
  939. solution. The good solution would be a dedicated tool to sync code and
  940. resources, I think.
  941.  
  942. -- 
  943. Francois Pottier                                            pottier@dmi.ens.fr
  944. - ----------------------------------------------------------------------------
  945. Check my WWW page at http://acacia.ens.fr:8080/home/pottier/index.html ...
  946.  
  947. +++++++++++++++++++++++++++
  948.  
  949. >From casseres@apple.com (David Casseres)
  950. Date: Thu, 02 Feb 1995 10:23:14 -0800
  951. Organization: Apple Computer, Inc.
  952.  
  953. In article <3gq7mg$kkn@newsy.ifm.liu.se>, ingemar@lysator.liu.se (Ingemar
  954. Ragnemalm) wrote:
  955.  
  956. > altura@aol.com (ALTURA) writes:
  957. > >> + Resources are mapped to the program by a bunch of #define's. This
  958. > >seems like  
  959. > >> it would get out of hand in a program with a realistic set of resources.
  960. > >That's how I do it.  Although, I now think enums are a better choice.
  961. > Big deal - anything that defines constants, so we can write kGeneralAlert
  962. > instead of 128. #define, enum, Pascal's const (which I use), what's the
  963. > difference?
  964.  
  965. #define is not part of the language, properly speaking, and it only does a
  966. mindless lexical substitution.  That means that the meaning of
  967. "KGeneralAlert" might be different in different contexts, and you might
  968. not find the rules spelled out in a language standard.  The trend in C++,
  969. at least, is to get away from using preprocessor directives for anything
  970. that can be done with the compiler, which is presumably smarter and whose
  971. behavior is more standardized.
  972.  
  973. const is a standard language feature but it carries too much baggage; it
  974. isn't what we are used to thinking of as a constant, rather it is a
  975. full-blown variable that the compiler allows you to initialize but not to
  976. assign to after initialization.  Personally I find this lame.
  977.  
  978. enum is also a standard language feature but it means the same as a
  979. traditional integer constant.  It's what I use, though I think it's lame
  980. to have to use the enum syntax when all you want is integer constants.
  981.  
  982. It's important to be consistent, and since almost all constants are either
  983. integers, or characters, or strings, I use enums everywhere.
  984.  
  985. And BTW don't let me get started on how C treats character and string
  986. constants!  The great thing about C++ (besides the fact that it exists) is
  987. that it's just C.  And the awful thing about C++ (besides the fact that
  988. we're gonna be stuck with it forever) is that it's just C.
  989.  
  990. -- 
  991. David Casseres
  992. Exclaimer: Hey!
  993.  
  994. +++++++++++++++++++++++++++
  995.  
  996. >From stk@berlin.snafu.de (Stefan Kurth)
  997. Date: Wed, 01 Feb 1995 17:59:38 +0100
  998. Organization: none
  999.  
  1000. Alex Curylo <first.ascent@mindlink.bc.ca> wrote:
  1001.  
  1002. > What most people I know do is use common Rez and program headers, usually
  1003. > with a .r.h or .common.h (as in AppsToGo) suffix. That makes it easy
  1004. > enough that I really haven't noticed this as being a problem.
  1005.  
  1006. You mean you have -all- your resources in rez format?  Icons and PICTs
  1007. and all?
  1008.  
  1009. ________________________________________________________________________
  1010. Stefan Kurth               Berlin, Germany           stk@berlin.snafu.de
  1011.  
  1012. +++++++++++++++++++++++++++
  1013.  
  1014. >From gurgle@dnai.com (Pete Gontier)
  1015. Date: Thu, 02 Feb 1995 14:34:55 -0700
  1016. Organization: cellular
  1017.  
  1018. In article <3gqee3$rlh@nef.ens.fr>,
  1019. pottier@triere.ens.fr (Francois Pottier) wrote:
  1020.  
  1021. > On the other hand, if each (source) file has its own resource definitions, 
  1022. > resource ID conflicts are hard to avoid. It looks like it's a problem
  1023. > without a good solution. The good solution would be a dedicated tool to
  1024. > sync code and resources, I think.
  1025.  
  1026. If you have an IDE which allows you to put multiple resource files into a
  1027. project (THINK Project Manager, CodeWarrior) *and* tells you about
  1028. resource ID conflicts when it's building the final target (THINK Project
  1029. Manager), then you can associate resource files with source files quite
  1030. freely.
  1031.  
  1032. Of course, it would be better to have a more seamless tool.
  1033.  
  1034. ______________________________________________________________________________
  1035.  Pete Gontier -- MacZealotry, Ink. -- gurgle@dnai.com
  1036.  
  1037.  "It's great to work for a company that lets you build good software 
  1038.   and doesn't give you any shit..."
  1039.              -- John McEnerney, Metrowerks PowerPC Product Architect
  1040.  
  1041. +++++++++++++++++++++++++++
  1042.  
  1043. >From gurgle@dnai.com (Pete Gontier)
  1044. Date: Thu, 02 Feb 1995 14:42:26 -0700
  1045. Organization: cellular
  1046.  
  1047. In article <3gq7mg$kkn@newsy.ifm.liu.se>,
  1048. ingemar@lysator.liu.se (Ingemar Ragnemalm) wrote:
  1049.  
  1050. > #define, enum, Pascal's const (which I use), what's the difference?
  1051.  
  1052. Among things posted by others, an 'enum' lets you define a series of
  1053. values without naming each value in the series:
  1054.  
  1055.         enum
  1056.         {
  1057.                 kResID_Dialog_TooLow = 127,
  1058.                 kResID_Dialog_YesNoCancel,
  1059.                 kResID_Dialog_SimpleMessage,
  1060.                 kResID_Dialog_Configuration
  1061.         };
  1062.  
  1063. If you want to add a member to this list, there's no need to bump the
  1064. values of each member up or down. In fact, there's no need to assign each
  1065. symbol a value in the first place. This is less useful for resource IDs,
  1066. of course, than it is for many other purposes. For example, 'STR#'
  1067. indexes.
  1068.  
  1069. Of course, in Pascal, you (may) have to devise something else, since enums
  1070. are not (fully, if at all) scalar.
  1071.  
  1072. ______________________________________________________________________________
  1073.  Pete Gontier -- MacZealotry, Ink. -- gurgle@dnai.com
  1074.  
  1075.  "It's great to work for a company that lets you build good software 
  1076.   and doesn't give you any shit..."
  1077.              -- John McEnerney, Metrowerks PowerPC Product Architect
  1078.  
  1079. +++++++++++++++++++++++++++
  1080.  
  1081. >From oster@netcom.com (David Phillip Oster)
  1082. Date: Thu, 2 Feb 1995 23:45:21 GMT
  1083. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  1084.  
  1085. In article <3goems$2br@unlisys.IN-Berlin.DE> stk@berlin.snafu.de (Stefan Kurth) writes:
  1086. >You mean you have -all- your resources in rez format?  Icons and PICTs
  1087. >and all?
  1088.  
  1089. Yes and no. Anything that can't be usefully described textually (i.e.,
  1090. will just be meaningless strings of hex at best) you handle with the
  1091. line in your .r file:
  1092.  
  1093. include "pictorial.resources";
  1094.  
  1095. which copies all the resources in that file into the output of the .r
  1096. -- 
  1097. - ------- oster@netcom.com ----------
  1098. There is no sight finer than that of the planet Earth in your rearview mirror.
  1099.  
  1100.  
  1101.  
  1102. +++++++++++++++++++++++++++
  1103.  
  1104. >From altura@aol.com (ALTURA)
  1105. Date: 2 Feb 1995 19:45:26 -0500
  1106. Organization: America Online, Inc. (1-800-827-6364)
  1107.  
  1108. > Big deal - anything that defines constants, so we can write
  1109. kGeneralAlert
  1110. > instead of 128. #define, enum, Pascal's const (which I use), what's the
  1111. > difference?
  1112.  
  1113. #defines can be bad because they don't follow scoping rules.  This
  1114. generally isn't a problem (especially if you make them all UPPERCASE), but
  1115. enums are safer.  Also, enums have the advantage of auto-incrementing. 
  1116. So, for menus I can do:
  1117.  
  1118. enum {
  1119.    file_menu = 100,
  1120.       open_command = 1,
  1121.       close_command,
  1122.       . . .
  1123. };
  1124.  
  1125. Further, most compilers (other than ThinkC) can't display #defines
  1126. symbollically - which is very annoying.
  1127.  
  1128. * * *
  1129.  
  1130. Another message mentioned putting all the resource #defines/enums in one
  1131. header.  I really like this approach because it makes it very easy to see
  1132. which IDs have been used and the appropriate next ID to use.
  1133.  
  1134. -Jordan
  1135.  
  1136. +++++++++++++++++++++++++++
  1137.  
  1138. >From first.ascent@mindlink.bc.ca (Alex Curylo)
  1139. Date: 3 Feb 1995 07:23:55 GMT
  1140. Organization: First Ascent
  1141.  
  1142. In article <osterD3ECnL.E76@netcom.com>
  1143. oster@netcom.com (David Phillip Oster) writes:
  1144.  
  1145. > Yes and no. Anything that can't be usefully described textually (i.e.,
  1146. > will just be meaningless strings of hex at best) you handle with the
  1147. > line in your .r file:
  1148. > include "pictorial.resources";
  1149.  
  1150. Unless, of course, you're using Code Warrior for the project, in which
  1151. case you include the .rsrc files of your choice directly into the
  1152. project file. (Now if they would just include autorezzing .r files...
  1153. :)
  1154.  
  1155. Alex Curylo  first.ascent@mindlink.bc.ca  (604)451-5323, fax -1359
  1156. ***  First Ascent: Mac programming, UP paragliders, indie CDs  ***
  1157.  
  1158. +++++++++++++++++++++++++++
  1159.  
  1160. >From majjick@aol.com (Majjick)
  1161. Date: 3 Feb 1995 21:35:20 -0500
  1162. Organization: America Online, Inc. (1-800-827-6364)
  1163.  
  1164. Can I be the only person to wish that there was a PL/I compiler for the
  1165. Mac?  What it is to be alone in the Universe...
  1166.  
  1167. Paul Magnussen
  1168.  
  1169. +++++++++++++++++++++++++++
  1170.  
  1171. >From cons116@twain.oit.umass.edu (Mike White)
  1172. Date: 6 Feb 1995 23:35:50 GMT
  1173. Organization: University of Massachusetts, Amherst
  1174.  
  1175. Ingemar Ragnemalm (ingemar@lysator.liu.se) wrote:
  1176.  
  1177. : Big deal - anything that defines constants, so we can write kGeneralAlert
  1178. : instead of 128. #define, enum, Pascal's const (which I use), what's the
  1179. : difference?
  1180.  
  1181. Enums are a better way to represent abstraction than #defines.  While they
  1182. essentially do the same job, enums can embody things conceptually so
  1183. that code will make sense to you or someone else later.  For example:
  1184.  
  1185. enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat}
  1186.  
  1187. is clearly better than 
  1188.  
  1189. #define Sun 1;
  1190. #define Mon 2;
  1191. etc..
  1192.  
  1193. This is true also for resources as you can enum resources which are
  1194. related and mutually exclusive.
  1195. --
  1196. ***************************************************************************
  1197. *  Michael White                *  "Man is a biped without feathers."     *
  1198. *  cons116@titan.ucs.umass.edu  *                                 -Plato  * 
  1199. ***************************************************************************
  1200.  
  1201. +++++++++++++++++++++++++++
  1202.  
  1203. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1204. Date: Tue, 7 Feb 1995 16:34:13 +1300 (NZDT)
  1205. Organization: (none)
  1206.  
  1207. majjick@aol.com (Majjick) writes:
  1208. > Can I be the only person to wish that there was a PL/I compiler for the
  1209. > Mac?  What it is to be alone in the Universe...
  1210.  
  1211. Why would you want PL/I when you can have languages with features
  1212. piled on like Ada and C++?? :-)
  1213.  
  1214.  
  1215. -- Bruce
  1216.    who on his first job in 1984 was given the choice of buying one of a
  1217.    FORTRAN, COBOL or PL/1 compiler.  Wheeee!!  What choice!!
  1218.  
  1219.    (I took PL/I, of course)
  1220.  
  1221. ---------------------------
  1222.  
  1223. >From dmark@aol.com (DMark)
  1224. Subject: Mac Primer (Vol 1) source available!!!
  1225. Date: 7 Feb 1995 19:22:31 -0500
  1226. Organization: America Online, Inc. (1-800-827-6364)
  1227.  
  1228. Well, I finally got everything together and uploaded to an FTP site that
  1229. accepts anonymous FTPs. The site name is:
  1230.  
  1231. ftp.u.washington.edu
  1232.  
  1233. and the folder to look in is:
  1234.  
  1235. /pub/user-supported/DaveMark/Primer1
  1236.  
  1237. There are four files in the directory. One has the Primer source in
  1238. CodeWarrior format, one has the Primer source in THINK C format, one has
  1239. the actual apps in 68K format and the last has the actual apps in PowerMac
  1240. format.
  1241.  
  1242. Feel free to download the files and upload them to your own bboards, FTP
  1243. sites, whatever. Oh, yeah, there's also a copy of THIN C 2.0 at the same
  1244. site in the folder:
  1245.  
  1246. /pub/user-supported/DaveMark/LearnC
  1247.  
  1248. Thanks for your patience and please help me spread the word...
  1249.  
  1250. Dave Mark
  1251.  
  1252. ---------------------------
  1253.  
  1254. >From peter@mail.peter.com.au (Peter N Lewis)
  1255. Subject: Pascal Programmers Mailing List
  1256. Date: Thu, 02 Feb 1995 16:56:59 +0800
  1257. Organization: Curtin University
  1258.  
  1259. I expect I'll regret this.  I've set up a mailing list for Pascal
  1260. programmers.  This list is for discussions that particularly relate to
  1261. programming the Macintosh in Pascal (MPW, MW, THINK, LS, whatever),
  1262. including problems related to SOM, ASLM, Universal Interfaces, PPC/68k,
  1263. UniversalProcPtr, etc etc.  This is *not* for general programming Q&A
  1264. (which belongs on one of the comp.sys.mac.* newsgroups).  People from
  1265. companies that produce Pascal compilers are welcome and encouraged to join
  1266. the list.
  1267.  
  1268. The main reason for providing this list is to avoid creating a newsgroup,
  1269. since I think most Pascal questions are really generic programming
  1270. questions and should be asked on the normal newsgroups.  Only discussions
  1271. particularly relating to Pascal should be on this list.  However, that
  1272. said, there are a lot of topics of concern to Pascal programers
  1273. (especially the problems of dealing with all the new technologies), and
  1274. hopefully this list will be a useful tool for discussing solutions to
  1275. these new problems.
  1276.  
  1277. To subscribe, send mail to listserv@list.peter.com.au, any subject and body
  1278.  
  1279. subscribe pascal Your Name
  1280.  
  1281. (eg "subscribe pascal Peter N Lewis")
  1282.  
  1283. Enjoy,
  1284.    Peter.
  1285. -- 
  1286. The probability of me making it to the WWDC in 1995 is currently: 74%
  1287.  
  1288. +++++++++++++++++++++++++++
  1289.  
  1290. >From catambay@aol.com (Bill the Cat)
  1291. Date: Fri, 03 Feb 1995 15:50:51 -0800
  1292. Organization: Larryville
  1293.  
  1294. In article <peter-0202951657000001@rocky.curtin.edu.au>,
  1295. peter@mail.peter.com.au (Peter N Lewis) wrote:
  1296.  
  1297. > I expect I'll regret this.  I've set up a mailing list for Pascal
  1298. > programmers.  This list is for discussions that particularly relate to
  1299. > programming the Macintosh in Pascal (MPW, MW, THINK, LS, whatever),
  1300. > including problems related to SOM, ASLM, Universal Interfaces, PPC/68k,
  1301. > UniversalProcPtr, etc etc.  This is *not* for general programming Q&A
  1302. > (which belongs on one of the comp.sys.mac.* newsgroups).  People from
  1303. > companies that produce Pascal compilers are welcome and encouraged to join
  1304. > the list.
  1305. > The main reason for providing this list is to avoid creating a newsgroup,
  1306. > since I think most Pascal questions are really generic programming
  1307. > questions and should be asked on the normal newsgroups.  Only discussions
  1308. > particularly relating to Pascal should be on this list.  However, that
  1309. > said, there are a lot of topics of concern to Pascal programers
  1310. > (especially the problems of dealing with all the new technologies), and
  1311. > hopefully this list will be a useful tool for discussing solutions to
  1312. > these new problems.
  1313. > To subscribe, send mail to listserv@list.peter.com.au, any subject and body
  1314. > subscribe pascal Your Name
  1315. > (eg "subscribe pascal Peter N Lewis")
  1316. > Enjoy,
  1317. >    Peter.
  1318.  
  1319.  
  1320. I think this is a great idea.  I've already got a list of many MAC
  1321. programmers interested in a Pascal group.  I can E-mail you that list, or
  1322. simply add you to mine (or both).  
  1323.  
  1324. Regards,
  1325. Bill
  1326.  
  1327. ---------------------------
  1328.  
  1329. >From raub@alder.circa.ufl.edu
  1330. Subject: Scroll bar in dialog box
  1331. Date: 4 Feb 1995 18:40:32 -0600
  1332. Organization: UTexas Mail-to-News Gateway
  1333.  
  1334.         What can I say?  After almost a month struglling with the bloody 
  1335. thing, I still cannot get a simple scroll bar to work with my dialog 
  1336. box.  This is getting aggravating, you know. =(
  1337.  
  1338. The idea here is to pop up a modal dialog box that would allow the user 
  1339. to set up some stuff in my program (isn't that what dialogs are for?). 
  1340. The main routine (Think C 5.0 code BTW) is the following:
  1341.  
  1342. #include "KitCat.h"
  1343.  
  1344. /*********************************************************************
  1345.  *
  1346.  * Routine to handle the gSetup dialog:
  1347.  *      o Initialize the dialog
  1348.  *      o Pop it up
  1349.  *      o Check whether the user has pressed the OK button
  1350.  *      o Dispose of the dialog, freeing all Heap storage associated with 
  1351.  *        the dialog
  1352.  *
  1353.  *********************************************************************/
  1354. void DoSetupDialog()
  1355. {
  1356.         int                             itemHit, dialogDone = FALSE;
  1357.         int                             itemType;
  1358.         Rect                    itemRect;
  1359.         Handle                  itemHandle;
  1360.         GrafPtr                 oldPort;
  1361.         DialogPtr               gSetup;
  1362.         
  1363.         gSetup = GetNewDialog(SETUP, NIL_POINTER, 
  1364.                                    MOVE_TO_FRONT); /* Initialize Dialog */
  1365.         
  1366.         if ( gSetup == NIL_POINTER)
  1367.                 return;
  1368.                                    
  1369.         ShowWindow ( gSetup );       /* Popup the dialog                */
  1370.     
  1371.     GetPort ( &oldPort );        /* Save the old top window         */
  1372.     SetPort ( gSetup );          /* Set gSetup to be the top window */
  1373.                 
  1374.     GetDItem( gSetup, setupOkButton, &itemType, &itemHandle, 
  1375.                   &itemRect);        /* Get handle (itemHandle) for     *
  1376.                                       * setupOkButton                   */
  1377.         OutlineButton( (ControlHandle) itemHandle);   
  1378.                                      /* Put double pixel border around  *
  1379.                                       * setupOkButton                   */
  1380.         
  1381.         while ( dialogDone == FALSE )
  1382.         {
  1383.                 ModalDialog ( NIL_POINTER, &itemHit);
  1384.                 switch(itemHit)
  1385.                 {
  1386.                         case setupOkButton:
  1387.                                 dialogDone = TRUE;
  1388.                                 break;
  1389.  
  1390.                         case setupCancelButton:
  1391.                                 dialogDone = TRUE;
  1392.                                 break;
  1393.                 
  1394.                         case setupVolumeControl:
  1395.                                 DoControlVolume(gTheEvent.where, gSetup);
  1396.                                 break;
  1397.                 
  1398.                 }
  1399.         }
  1400.                 
  1401.         DisposDialog (gSetup);    /* Dispose of the dialog   */
  1402.     SetPort ( oldPort );           /* Restore the old top window    */
  1403. }
  1404.  
  1405. As you probably have noticed, my tabs that looked so nice in Think C 5
  1406. look terrible here.  Bear with me.  The routine that is supposed to play
  1407. with the scroll bar, DoControlVolume, is shown below: 
  1408.  
  1409. #include "KitCat.h"
  1410.  
  1411. /*********************************************************************
  1412.  *
  1413.  * Routine to handle the gSetup dialog:
  1414.  *      o Initialize the dialog
  1415.  *      o Pop it up
  1416.  *      o Check whether the user has pressed the OK button
  1417.  *      o Dispose of the dialog, freeing all Heap storage associated with 
  1418.  *        the dialog
  1419.  *
  1420.  *      NOTE
  1421.  *
  1422.  *      o DialogPtr = WindowPtr = GrafPtr
  1423.  *
  1424.  *********************************************************************/
  1425. void DoControlVolume( Point thePoint, GrafPtr theWindow)
  1426. {
  1427.         int                             itemHit;
  1428.         int                             itemType;
  1429.         Rect                    scrollBarRect;
  1430.         Handle                  itemHandle;
  1431.         GrafPtr                 oldPort;
  1432.         ControlHandle   scrollBarHandle, theControl;
  1433.         short int               thePart;
  1434.  
  1435.     SetPort ( theWindow );     /* Set theWindow to be the top window */
  1436.  
  1437.         GetDItem( theWindow, setupVolumeControl, &itemType, &scrollBarHandle,
  1438.                           &scrollBarRect);
  1439.                           
  1440.         GlobalToLocal(&thePoint);
  1441.         thePart = FindControl(thePoint, theWindow, &theControl);
  1442.         
  1443.         if(theControl == scrollBarHandle)
  1444.         {
  1445.                 if(thePart == inThumb)
  1446.                 {
  1447.                         thePart = TrackControl( theControl, thePoint, 
  1448.                         NIL_ACTION_PROC);
  1449.                 }
  1450.                 else
  1451.                 {
  1452.                         thePart = TrackControl( theControl, thePoint, 
  1453.                         &DoScroll);
  1454.                 }
  1455.         }
  1456. }
  1457.  
  1458. The routine I am using to handle the bloody scroll bar is pretty much 
  1459. taken from the Macintosh C Programming Primer:
  1460.  
  1461. #include "KitCat.h"
  1462.  
  1463. /*********************************************************************
  1464.  *
  1465.  * Function to handle a scroll bar, updating it.
  1466.  *
  1467.  *********************************************************************/
  1468. pascal void DoScroll(ControlHandle theControl, int theCode)
  1469. {
  1470.         
  1471.         int curControlValue, maxControlValue, minControlValue;
  1472.         
  1473.         maxControlValue = GetCtlMax(theControl);
  1474.         minControlValue = GetCtlMin(theControl);
  1475.         curControlValue = GetCtlValue(theControl);
  1476.         
  1477.         switch(theCode)
  1478.         {
  1479.                 case inPageDown:
  1480.                 case inDownButton:
  1481.                         if (curControlValue < maxControlValue)
  1482.                                 curControlValue +=1;
  1483.                         break;
  1484.                 case inPageUp:
  1485.                 case inUpButton:
  1486.                         if (curControlValue > minControlValue)
  1487.                                 curControlValue -=1;
  1488.                         break;
  1489.         }
  1490.         SetCtlValue(theControl, curControlValue);
  1491.         
  1492. }
  1493.  
  1494. The scroll bar itself is defined as a control and installed in the dialog 
  1495. using ResEdit.  I did that since I though I could then use GetDItem to 
  1496. get the Handle to it.  Am I right?  Anyway, what do I get off the above 
  1497. piece of code?  Nothing.  No action from the scroll bar.  As in previous  
  1498. questions, suggestions are more than welcome.
  1499.  
  1500. +++++++++++++++++++++++++++
  1501.  
  1502. >From Roy@AdeptSolutions.com (Roy Lovejoy)
  1503. Date: Sun, 5 Feb 1995 08:02:20 GMT
  1504. Organization: Adept Solutions
  1505.  
  1506. In article <199502050041.TAA28058@birch.circa.ufl.edu>,
  1507. raub@alder.circa.ufl.edu wrote:
  1508.  
  1509. >         What can I say?  After almost a month struglling with the bloody 
  1510. > thing, I still cannot get a simple scroll bar to work with my dialog 
  1511. > box.  This is getting aggravating, you know. =(
  1512. >  
  1513.  
  1514. What you are running into is the fact that the Dialog Manager calls
  1515. TrackControl() {for better or worse}, for you. (That's what makes the
  1516. buttons/checkboxes/radio buttons track so nicely.) The problem is that YOU
  1517. get control too late, if you WAIT until after ModalDialog().
  1518.  
  1519. What I have found to work quite nicely (in a number of commercial sw
  1520. packages), is to just have pass an event proc to ModalDialog(), and in
  1521. *THAT* proc, check to see if the event is a mouse down in your control (by
  1522. using FindControl() in the event proc.) You can compare control handles,
  1523. refcons, or my favorite, titles, to see if the click is on a scroll bar
  1524. (which you should handle) or something else (which is best left to
  1525. ModalDialog(). (I name ALL of my scroll bars "slider", that never shows up
  1526. anywhere, so I can use one routine to handle such an instance).
  1527.  
  1528. So the main point is YOU need to grab the event before ModalDialog() does.
  1529. Where? In the event proc. If it is YOUR event, and YOU call TrackControl()
  1530. be sure to 'erase' the event in your ModalDialog event filter by stuffing
  1531. a 0x00 into the event.what field (so ModalDialog() will ignore it).
  1532.  
  1533. But a bigger issue is your skating close to one of the original (yes, that
  1534. means 1984) ten commandments. Thou shalt not use the Dialog Manager for
  1535. your complicated UI. Scroll bars (other than the ListManager's) might
  1536. indicate a level of complexity that should be addressed by going straight
  1537. for the groin & using the Window Manager, controls & event loops. Although
  1538. the solution I gave above will work 100%, You now are delving into many
  1539. more callback & hooks & this proc & that proc, than is humanly necessary.
  1540. If you did this manually with Window Manager & your own Control Handles,
  1541. etc, the only hook you would need is the TrackControl one (which you would
  1542. need anyhow.)
  1543.  
  1544. there.
  1545. - -------------------------------------------------------------------
  1546. Roy Lovejoy          PHONE: 619.727.6825  INET:roy@AdeptSolutions.com
  1547. Pixel PooBah           FAX: 619.727.5869   ALINK: ............. adept
  1548. Adept Solutions      PTALK                   CIS: ........ 72447,1447
  1549. 524 Avenida Verde       DD: 619.598.5225  eWorld: ........ adeptsolns
  1550. San Marcos CA 92069                          AOL: ........ adeptsolns
  1551. - -------------------------------------------------------------------
  1552.  
  1553. +++++++++++++++++++++++++++
  1554.  
  1555. >From Jaeger@fquest.com (Brian Stern)
  1556. Date: 5 Feb 1995 14:16:56 GMT
  1557. Organization: The University of Texas at Austin, Austin, Texas
  1558.  
  1559. In article <199502050041.TAA28058@birch.circa.ufl.edu>,
  1560. raub@alder.circa.ufl.edu wrote:
  1561.  
  1562. <         What can I say?  After almost a month struglling with the bloody 
  1563. < thing, I still cannot get a simple scroll bar to work with my dialog 
  1564. < box.  This is getting aggravating, you know. =(
  1565. <  
  1566. < The idea here is to pop up a modal dialog box that would allow the user 
  1567. < to set up some stuff in my program (isn't that what dialogs are for?). 
  1568. < The main routine (Think C 5.0 code BTW) is the following:
  1569. <  
  1570. < /*********************************************************************
  1571. <  *
  1572. <  * Routine to handle the gSetup dialog:
  1573. <  *      o Initialize the dialog
  1574. <  *      o Pop it up
  1575. <  *      o Check whether the user has pressed the OK button
  1576. <  *      o Dispose of the dialog, freeing all Heap storage associated with 
  1577. <  *        the dialog
  1578. <  *
  1579. <  *      NOTE
  1580. <  *
  1581. <  *      o DialogPtr = WindowPtr = GrafPtr
  1582. <  *
  1583. <  *********************************************************************/
  1584. < void DoControlVolume( Point thePoint, GrafPtr theWindow)
  1585. < {
  1586. <         int                             itemHit;
  1587. <         int                             itemType;
  1588. <         Rect                    scrollBarRect;
  1589. <         Handle                  itemHandle;
  1590. <         GrafPtr                 oldPort;
  1591. <         ControlHandle   scrollBarHandle, theControl;
  1592. <         short int               thePart;
  1593. <  
  1594. <     SetPort ( theWindow );     /* Set theWindow to be the top window */
  1595. <  
  1596. <         GetDItem( theWindow, setupVolumeControl, &itemType, &scrollBarHandle,
  1597. <                           &scrollBarRect);
  1598. <                           
  1599. <         GlobalToLocal(&thePoint);
  1600. <         thePart = FindControl(thePoint, theWindow, &theControl);
  1601. <         
  1602. <         if(theControl == scrollBarHandle)
  1603. <         {
  1604. <                 if(thePart == inThumb)
  1605. <                 {
  1606. <                         thePart = TrackControl( theControl, thePoint, 
  1607. <                         NIL_ACTION_PROC);
  1608. <                 }
  1609. <                 else
  1610. <                 {
  1611. <                         thePart = TrackControl( theControl, thePoint, 
  1612. <                         &DoScroll);
  1613. <                 }
  1614. <         }
  1615. < }
  1616. <  
  1617. < The routine I am using to handle the bloody scroll bar is pretty much 
  1618. < taken from the Macintosh C Programming Primer:
  1619. <  
  1620. <  
  1621. < The scroll bar itself is defined as a control and installed in the dialog 
  1622. < using ResEdit.  I did that since I though I could then use GetDItem to 
  1623. < get the Handle to it.  Am I right?  Anyway, what do I get off the above 
  1624. < piece of code?  Nothing.  No action from the scroll bar.  As in previous  
  1625. < questions, suggestions are more than welcome.
  1626.  
  1627. I don't think that you need all this code for calling TrackControl. 
  1628. ModalDialog will do this for you.  All you want is to call GetControlValue
  1629. when the user hits the OK button.  
  1630.  
  1631. Is your CNTL for your scrollbar marked 'enabled'?  There is a bug in
  1632. ResEdit regarding the item rects for CNTLs.  Open up the CNTL and open up
  1633. the DITL with the 'Open as template' menu item.  Verify that the item
  1634. rects are the same.  Often they are not and the dialog manager ignores the
  1635. hits because the item rects are out of sync.
  1636.  
  1637. You should really be using a slider for setting a volume, not a scroll
  1638. bar.  There are a handful of slider CDEFs at the various archives.  The
  1639. one that I like is by Harold Ekstrom and is at the alt.sources.mac
  1640. archive.
  1641.  
  1642. You are skating on very thin ice by using ints when dealing with the
  1643. toolbox.  In your 'DoControlVolume' routine you pass the address of an int
  1644. to GetDItem.  This is very bad.  The toolbox expects the address of shorts
  1645. in this call.  If you have 4 byte ints turned on you will be screwed. 
  1646. When dealing with the toolbox it is a good idea to always explicitly use
  1647. long ints or short ints.  If you are passing an address to the toolbox you
  1648. must use a long or a short.  Having code that depends on the size of an
  1649. int will get you in trouble sooner or later.
  1650.  
  1651. Good luck,
  1652.  
  1653. -- 
  1654. Brian  Stern  :-{)}
  1655. Toolbox commando and Menu bard
  1656. Jaeger@fquest.com
  1657.  
  1658. ---------------------------
  1659.  
  1660. >From "Andrew C. Plotkin" <ap1i+@andrew.cmu.edu>
  1661. Subject: SndDoCommand at interrupt time
  1662. Date: Tue, 31 Jan 1995 11:57:05 -0500
  1663. Organization: Information Technology Center, Carnegie Mellon, Pittsburgh, PA
  1664.  
  1665. (And lo, I have been enlightened as to GWorlds, so it's on to the next thing:)
  1666.  
  1667. Anyone know which SndCommands can safely be sent to the Sound Manager at
  1668. interrupt time? NIM:Sound charmingly comments that "most" can, and you
  1669. can do the rest by "preconfiguring the channel with a soundCmd at
  1670. non-interrupt time." Uh, great. Nowhere (that I can find) does it say
  1671. which commands are unsafe, although I *think* it's implying that
  1672. soundCmd is not.
  1673.  
  1674. It's the "draft" version of NIM:Sound that I have, off the Develop 19
  1675. bookmark CD; maybe the version on the NIM collection CD has more info?
  1676.  
  1677. --Z (This user may move or allocate memory, so he should not be emailed
  1678. at interrupt time)
  1679.  
  1680. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  1681.  
  1682. +++++++++++++++++++++++++++
  1683.  
  1684. >From rbneal@vnet.net (In The Dark Water)
  1685. Date: 4 Feb 1995 20:15:42 GMT
  1686. Organization: Vnet Internet Access, Charlotte, NC -  info@char.vnet.net
  1687.  
  1688. Andrew C. Plotkin (ap1i+@andrew.cmu.edu) wrote:
  1689. : (And lo, I have been enlightened as to GWorlds, so it's on to the next thing:)
  1690.  
  1691. Indeed, have a cold one, buddy.  GWorlds deserve a little post-brain 
  1692. activity.:)
  1693.  
  1694. : Anyone know which SndCommands can safely be sent to the Sound Manager at
  1695. : interrupt time? NIM:Sound charmingly comments that "most" can, and you
  1696. : can do the rest by "preconfiguring the channel with a soundCmd at
  1697. : non-interrupt time." Uh, great. Nowhere (that I can find) does it say
  1698. : which commands are unsafe, although I *think* it's implying that
  1699. : soundCmd is not.
  1700.  
  1701. It is safe to call SndDoCommand() and SndDoImmediate at the interrupt 
  1702. level, as long as you keep the standard interrupt level coding rules in 
  1703. mind.  Specifically, remember that interrupt routines cannot access a 
  1704. low memory global, especially with a ToolBox call.  They cannot access 
  1705. unlocked handles or other relocatable memory objects.  Memory Manager 
  1706. cannot allocate or alter a handle's state, or dispose of objects.  Most 
  1707. importantly, when you call an interrupt routine on a 68K machine, A5 
  1708. globals are no longer pointed to by A5.
  1709.  
  1710. Taking all this into account (Mac programming can really be fun 
  1711. sometimes, eh?), you should be able to use freqCmd, freqDurationCmd, 
  1712. um..callBackCmd, and everything else.  HOWEVER, you may not be able to 
  1713. use soundCmd or bufferCmd.  These commands may allocate memory, if you've 
  1714. prepared a sound channel in one format and want to play a sound in 
  1715. another format in it, or if you play a new sound that is compressed.
  1716.  
  1717. All the above is much more clearly explained in the most excellent book, 
  1718. "Ultimate Mac Programming", by Dave Mark, IDG Books 1994.  This book has 
  1719. an entire chapter devoted to Sound Manager, along with tons of info on 
  1720. Apple Events, OSA, the Object Model, patching traps, and generally all 
  1721. the other cool stuff you want to know about.  The book comes with a CD 
  1722. which contains tons of code and utilities, as well as a working copy of 
  1723. CodeWarrior.  IMHO, if you're doing Mac programming, you need this book.  
  1724. Anyway, I hope this info helps (most of it's paraphrased from the book);  
  1725. if you want to get into it more, definitely get the final IM:Sound.  If 
  1726. you'd like, drop me some email sometime.  Chances are, I've lost some 
  1727. hair and/or brain cells over it, and there's no reason anybody else 
  1728. should be unnecessarily bald :)
  1729.  
  1730. Thanks,
  1731.  
  1732. Brian Neal
  1733. Dogcowboy
  1734. rbneal@vnet.net
  1735.  
  1736. Apple Computer: The Power To Be Your Best.
  1737. Microsoft:      The Power To Tell You What Your Best Will Be.
  1738.  
  1739.  
  1740.  
  1741. ---------------------------
  1742.  
  1743. >From winter@ai.rl.af.mil (Jim Wintermyre)
  1744. Subject: Using ProcPtrs in Pascal for PPC
  1745. Date: Mon, 30 Jan 1995 23:30:00 GMT
  1746. Organization: Rome Laboratory
  1747.  
  1748. I often use procPtrs to make my code more flexible.  For example, in a
  1749. generic modal dialog routine I have, one of the parameters is a procPtr
  1750. to a routine that gets called in my ModalDialog loop, like so:
  1751.  
  1752.   repeat
  1753.    ModalDialog(@MyFilter, item);
  1754.  
  1755.    if modalCallBack <> nil then
  1756.     begin
  1757.      GetPort(oldPort);
  1758.      SetPort(theDialog);
  1759.  
  1760. {$IFC UNDEFINED Application}
  1761.      SetupA4;
  1762. {$ENDC}
  1763.  
  1764.      MCallBack(theDialog, item, modalCallBack); { call callback routine
  1765. }
  1766.  
  1767. {$IFC UNDEFINED Application}
  1768.      RestoreA4;
  1769. {$ENDC}
  1770.  
  1771.      SetPort(oldPort);
  1772.     end;
  1773.  
  1774.   until item in [kOKItem, kCancelItem];
  1775.  
  1776.  
  1777. To call this routine, which is declared as:
  1778.  
  1779.   procedure ModalCallBack (theDialog: DialogPtr; item:integer);
  1780.  
  1781. I use the following inline code:
  1782.  
  1783.   procedure MCallBack (theDialog: DialogPtr; item: integer;
  1784.                        theRoutine: ProcPtr);
  1785.    inline
  1786.     $205F,      { movea.l (sp)+,a0 }
  1787.     $4E90;      { jsr (a0) }
  1788.  
  1789.  
  1790. Now I'm converting the above code to work with CodeWarrior, and I'd
  1791. like to set it up so that it will compile for  68K or PPC.  My question
  1792. is, how do I get this to work in PPC code?  I assume I would have to
  1793. use PPC inline assembly?  The callback routine is in the same project
  1794. as the above code, so I know that it is going to be PPC code if the
  1795. above is PPC code; thus I don't believe I have to worry about using
  1796. UPPs.
  1797.  
  1798. Any ideas?
  1799.  
  1800. Thanks,
  1801. Jim
  1802.  
  1803. winter@ai.rl.af.mil
  1804. wintermyrej@lonex.rl.af.mil
  1805.  
  1806. +++++++++++++++++++++++++++
  1807.  
  1808. >From quinn@cs.uwa.edu.au (Quinn "The Eskimo!")
  1809. Date: Wed, 01 Feb 1995 10:52:15 +0800
  1810. Organization: Department of Computer Science, University of Western Australia
  1811.  
  1812. In article <1995Jan30.233000.15098@news.rlcn.rl.af.mil>,
  1813. winter@ai.rl.af.mil (Jim Wintermyre) wrote:
  1814.  
  1815. >Now I'm converting the above code to work with CodeWarrior, and I'd
  1816. >like to set it up so that it will compile for  68K or PPC.  My question
  1817. >is, how do I get this to work in PPC code?  I assume I would have to
  1818. >use PPC inline assembly?  The callback routine is in the same project
  1819. >as the above code, so I know that it is going to be PPC code if the
  1820. >above is PPC code; thus I don't believe I have to worry about using
  1821. >UPPs.
  1822.  
  1823. You need to read up about procedural types, a new extension to Pascal by
  1824. the Metrowerks people (praise be to Marcel!) that allows you to do this
  1825. sort of thing cleanly, without resorting to inlines.  It's all there in
  1826. the documentation.
  1827.  
  1828. The procedure type extensions remind me very much of Modula 2.  In fact
  1829. lots of MW Pascal reminds me of Modula 2, including procedure types,
  1830. qualified identifiers, system units, and so on.  Which is cool because
  1831. Modula 2 is IMHO the best simple procedural language every developed.
  1832.  
  1833. Share and Enjoy.
  1834. --
  1835. Quinn "The Eskimo!"     "Ah, so that's the secret,
  1836.                          if only Captain Bipto had known."
  1837.  
  1838. +++++++++++++++++++++++++++
  1839.  
  1840. >From peter@mail.peter.com.au (Peter N Lewis)
  1841. Date: Fri, 03 Feb 1995 10:27:54 +0800
  1842. Organization: Curtin University
  1843.  
  1844. >Well, something like that. Pretty neat, but what bothers me is that I know no
  1845. >way to assign and identify a "no function" value (i.e. nil) for a function
  1846. >valiable. I can use pointers to function variables, but @MyFunction is NOT
  1847. >a pointer to a function variable, and won't work.
  1848.  
  1849. I'd suggest reporting this as a bug.  I'm not sure if we reported it as a
  1850. bug when we were testing out procedure types, but we did come to the same
  1851. conslusion.
  1852.  
  1853. Every data type should have a "null" value.  For example, what is a null
  1854. valud for file reference numbers?  I normally use bad_rn = -32768, but
  1855. it'd be nice if the system defined one.  The alternative is using an rn
  1856. and a boolean, and that gets quite painful very quickly.
  1857.  
  1858. Enjoy,
  1859.    Peter.
  1860. -- 
  1861. The probability of me making it to the WWDC in 1995 is currently: 75%
  1862.  
  1863. +++++++++++++++++++++++++++
  1864.  
  1865. >From h+@metrowerks.com (Jon W{tte)
  1866. Date: Sun, 05 Feb 1995 10:14:15 +0100
  1867. Organization: The Conspiracy
  1868.  
  1869. In article <peter-0302951027540001@rocky.curtin.edu.au>,
  1870. peter@mail.peter.com.au (Peter N Lewis) wrote:
  1871.  
  1872. >Every data type should have a "null" value.  For example, what is a null
  1873. >valud for file reference numbers?  I normally use bad_rn = -32768, but
  1874. >it'd be nice if the system defined one.  The alternative is using an rn
  1875. >and a boolean, and that gets quite painful very quickly.
  1876.  
  1877. 0 is a good null value for files; it's always allocated to the 
  1878. system resource file, and since you shouldn't be messing with 
  1879. that, safely assume 0 == NULL frefnum.
  1880.  
  1881. Cheers,
  1882.  
  1883.                                         / h+
  1884.  
  1885.  
  1886. --
  1887.   Jon Wdtte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  1888.  
  1889. "If you want to see a pipelined execution model, go to a laundromat."
  1890.       Richard Clark
  1891.  
  1892.  
  1893. ---------------------------
  1894.  
  1895. >From mpeirce@outpost.peircesw.com (Michael Peirce)
  1896. Subject: Vertical Text w-o QuickDraw GX
  1897. Date: Sat, 18 Feb 95 20:17:28 PT
  1898. Organization: Peirce Software, Inc.
  1899.  
  1900. Someone was asking about how to do vertical text.
  1901.  
  1902. While I agree that QuickDraw GX makes this trivial, I also realize
  1903. most people haven't switch over to it yet.  So I dug this postig out
  1904. of my archives.  Reposted w/o permission, sorry Martin...
  1905.  
  1906. _______
  1907. From: minow@Apple.COM (Martin Minow)
  1908. Subject: Re: Vertical Text in QuickDraw
  1909. Date: 27 Jun 92 02:21:27 GMT
  1910.  
  1911.  
  1912. anthony@alumni.src.umd.edu asks about drawing text vertically. When I
  1913. had this problem, I solved it by writing the text into an offscreen
  1914. grafport, and transposing the port. Here's the subroutine for your
  1915. reading pleasure:
  1916.  
  1917. /*
  1918.  * Transpose an arbitrary bitmap (i.e., rotate it 90!).
  1919.  */
  1920.  
  1921. #ifdef DOCUMENTATION
  1922.  
  1923. Title           Transpose a Bitmap
  1924.  
  1925. Usage
  1926.  
  1927.                 #include "Support.h"
  1928.  
  1929.                 GrafPtr
  1930.                 TransposeGrafPort(srcPort)
  1931.                 GrafPtr                 srcPort
  1932.                 
  1933.                 Return a GrafPort whose bitmap that is the transpose of
  1934.                 the source bitmap (i.e., what was vertical in the source
  1935.                 becomes horizontal in the destination).  This routine calls
  1936.                 routines in the OffscreenGrafPort library to create the
  1937.                 new port.
  1938.                         
  1939.                 If the source bitmap is invalid (or there is no memory),
  1940.                 TransposeGrafPort returns NIL (zero).
  1941.                 
  1942.                 The result is rotated 90! counter-clockwise.  I.e., the
  1943.                 upper-left pixel in the source becomes the lower-left
  1944.                 pixel in the destination:
  1945.                 
  1946.                         ****                     **  ***
  1947.                         *       *                       *   *
  1948.                         ****    becomes *   *
  1949.                         *       *                       *   *
  1950.                         *       *                       ********
  1951.                         
  1952.  
  1953. Normal Usage:
  1954.  
  1955.                         GrafPtr                 savePort;
  1956.                         GrafPtr                 srcPort;
  1957.                         GrafPtr                 dstPort;
  1958.  
  1959.                         GetPort(&savePort);
  1960.                         srcPort = CreateOSGrafPort(rect);
  1961.                         ... drawing commands ...
  1962.                         dstPort = TransposeGrafPort(srcPort);
  1963.                         SetPort(savePort);
  1964.                         DeleteOSGrafPort(srcPort);
  1965.                         if (dstPort != NIL) {
  1966.                                 CopyBits(
  1967.                                         &dstPort->portBits,
  1968.                                         &window->portBits,
  1969.                                         &dstPort->portBits.bounds,
  1970.                                         &drawing_rect,
  1971.                                         srcCopy,
  1972.                                         NIL
  1973.                                 );
  1974.                                 DeleteOSGrafPort(dstport);
  1975.                         }
  1976.  
  1977. author
  1978.  
  1979.                 Martin Minow.
  1980.         
  1981. Copyright
  1982.         
  1983.                 Copyright 1989, Martin Minow.  All rights reserved.
  1984.  
  1985.                 You may redistribute or incorporate this software in
  1986.                 any application without restriction as long as this
  1987.                 copyright notice remains intact and this source is not
  1988.                 redistributed for profit.
  1989.                 
  1990. #endif
  1991.  
  1992. #include "Support.h"
  1993.  
  1994. /*
  1995.  * This macro returns a pointer to the byte containing [v, h]
  1996.  *              base            is src_base or dst_base
  1997.  *              rowBytes        is src_rowBytes or dst_rowBytes
  1998.  *              v                       is the vertical coordinate
  1999.  *              h                       is the horizontal coordinate
  2000.  */
  2001. #define loc(base, rowBytes, v, h)               \
  2002.         (unsigned char *) ((base) + ((long) (v) * (rowBytes)) + ((h) >> 3))
  2003.  
  2004. GrafPtr
  2005. TransposeGrafPort(srcPort)
  2006. GrafPtr                         srcPort;
  2007. {
  2008.                 register short                  i;
  2009.                 register short                  j;
  2010.                 register short                  k;
  2011.                 register unsigned char  *ptr;
  2012.                 GrafPtr                                 dstPort;
  2013.                 BitMap                                  *src;
  2014.                 BitMap                                  *dst;
  2015.                 Rect                                    dst_rect;
  2016.                 int                                             dst_width, dst_height;
  2017.                 int                                             src_max;
  2018.                 Ptr                                             src_base;
  2019.                 Ptr                                             dst_base;
  2020.                 short                                   src_rowBytes, dst_rowBytes;
  2021.  
  2022.                 /*
  2023.                  * Get the destination bitmap organization (transposed)
  2024.                  * and create the destination bitmap..
  2025.                  */
  2026.                 src = &srcPort->portBits;
  2027.                 dst_rect.top    = src->bounds.left;
  2028.                 dst_rect.left   = src->bounds.top;
  2029.                 dst_rect.bottom = src->bounds.right;
  2030.                 dst_rect.right  = src->bounds.bottom;
  2031.                 if ((dstPort = CreateOSGrafPort(dst_rect)) == NIL)
  2032.                         return (NIL);
  2033.                 EraseRect(&dst_rect);
  2034.                 dst = &dstPort->portBits;
  2035.                 src_base = src->baseAddr;
  2036.                 dst_base = dst->baseAddr;
  2037.                 src_rowBytes = src->rowBytes;
  2038.                 dst_rowBytes = dst->rowBytes;
  2039.                 dst_width = width(dst->bounds);
  2040.                 dst_height = height(dst->bounds);
  2041.                 k = width(src->bounds);                                 /* For mirror transform */
  2042.                 for (j = 0; j < dst_height; j++) {              /* dst v, src h                 */
  2043.                         --k;                                                            /* Horiz pixel in src   */
  2044.                         for (i = 0; i < dst_width; i++) {       /* dst h, src v                 */
  2045.                                 ptr = loc(src_base, src_rowBytes, i, k);
  2046.                                 if ((((*ptr) >> (7 - (k & 7))) & 1) != 0) {
  2047.                                         ptr = loc(dst_base, dst_rowBytes, j, i);
  2048.                                         *ptr |= (0x80 >> (i & 0x7));
  2049.                                 }
  2050.                         }
  2051.                 }
  2052.                 return (dstPort);
  2053. }
  2054.  
  2055. - -
  2056.  Note: the above should have tabs set every 4 bytes.
  2057. Also note that it presupposes a subroutine that creates an offscreen
  2058. GrafPort to hold the destination rect.
  2059.  
  2060. Martin Minow
  2061. minow@apple.com
  2062.  
  2063. __ Michael Peirce        __ mpeirce@peircesw.com
  2064. __ Peirce Software, Inc. __ 719 Hibiscus Place, Suite 301
  2065. __                       __ San Jose, California USA 95117-1844
  2066. __ Makers of: SMOOTHIE & __ voice: +1.408.244.6554 fax: +1.408.244.6882
  2067. __    PEIRCE PRINT TOOLS __ AppleLink & AOL: peirce
  2068.  
  2069. ---------------------------
  2070.  
  2071. >From arisz@hub.toronto.edu (Aris Zakinthinos)
  2072. Subject: [Q] Fading a PixMap?
  2073. Date: 30 Jan 95 15:18:08 GMT
  2074. Organization: Computer Science Research Institute
  2075.  
  2076. In an application I am working on I have a slide show.  I fade the screen
  2077. to black then fade it back with the first picture.  What I think would be
  2078. really cool is if the picture faded out and the next picture faded in.  I
  2079. don't want to fade the whole screen because there is writting on the
  2080. screen.  I thought the best way would be to have the picture have its own
  2081. GDevice then fade the GDevice the same way I fade the screen.  But I am
  2082. not sure this will work or even how to do it.  Any help would be
  2083. appreciated.
  2084.  
  2085. Thanks in advance.
  2086.  
  2087. Aris.
  2088.  
  2089. arisz@hub.toronto.edu
  2090.  
  2091. +++++++++++++++++++++++++++
  2092.  
  2093. >From kenlong@netcom.com (Ken Long)
  2094. Date: Mon, 30 Jan 1995 20:15:56 GMT
  2095. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2096.  
  2097. Aris Zakinthinos (arisz@hub.toronto.edu) wrote:
  2098. : In an application I am working on I have a slide show.  I fade the screen
  2099. : to black then fade it back with the first picture.  What I think would be
  2100. : really cool is if the picture faded out and the next picture faded in.  I
  2101. : don't want to fade the whole screen because there is writting on the
  2102. : screen.  I thought the best way would be to have the picture have its own
  2103. : GDevice then fade the GDevice the same way I fade the screen.  But I am
  2104. : not sure this will work or even how to do it.  Any help would be
  2105. : appreciated.
  2106.  
  2107. Here's a routine from Mac Shonle (BendImageFast, PaletteTricks, 
  2108. clutFader1.2) used in a picture to picture fade.  The fade, in his demo, 
  2109. uses the whole screen.  He has a palette for the first picture and one 
  2110. for the second and this routine fades between the palettes.  But, you 
  2111. should be able to make it applicable to only a portion of the screen 
  2112. (i.e: a window or rect).
  2113.  
  2114. Mac is going to release free demo source for this, once finalized.
  2115.  
  2116. void FadeToPalette( long numTicks, 
  2117.                         CTabHandle destTab, 
  2118.                             GDHandle aGDevice )
  2119. {    
  2120.     // get the monitorUs current clut
  2121.     CTabHandle    srcTab = (**(**aGDevice).gdPMap).pmTable;    
  2122.     
  2123.     // We want the range for each color to be of an
  2124.     //  unsigned short, but we need negative numbers,
  2125.     //  so these signed longs are the solution.
  2126.     long        redDelta[256];        
  2127.     long        greenDelta[256];    
  2128.     long        blueDelta[256];        
  2129.     
  2130.     // used to clear up clutter in the code
  2131.     long        difference;            
  2132.     
  2133.     long        i;             // used to cycle trough loops
  2134.     long        colorIndex;    // used to cycle through color indices
  2135.     
  2136.     long        theTicks;
  2137.     
  2138.     // to help us return stuff the way we found it
  2139.     GDHandle    oldGDevice;
  2140.     
  2141.     // we will only do it on 8-bit devices
  2142.     if( (**(**aGDevice).gdPMap).pixelSize != 8 )    
  2143.         return;
  2144.     
  2145.     oldGDevice = GetGDevice();    // save the old
  2146.     
  2147.     SetGDevice( aGDevice );       // set it to the monitor to be faded
  2148.     
  2149.     /**** Set up the deltas ****/
  2150.     for( colorIndex=0; colorIndex<256; colorIndex++ )
  2151.     {    
  2152.         /* This is what I am thinking: take the difference between 
  2153.         the two colors and divide it by the number of steps 
  2154.         (numTicks). So we will have a number that can be subtracted
  2155.         to the source numTicks times and have it end up equaling 
  2156.         the destination.
  2157.         */
  2158.         
  2159.         difference = ( (long)(**srcTab).ctTable[colorIndex].rgb.red - 
  2160.                        (long)(**destTab).ctTable[colorIndex].rgb.red );
  2161.         redDelta[colorIndex] = difference / numTicks;
  2162.         
  2163.         difference = ( (long)(**srcTab).ctTable[colorIndex].rgb.green - 
  2164.                        (long)(**destTab).ctTable[colorIndex].rgb.green );
  2165.         greenDelta[colorIndex] = difference / numTicks;
  2166.         
  2167.         difference = ( (long)(**srcTab).ctTable[colorIndex].rgb.blue - 
  2168.                        (long)(**destTab).ctTable[colorIndex].rgb.blue );
  2169.         blueDelta[colorIndex] = difference / numTicks;
  2170.     }
  2171.     
  2172.     /**** Do the fade ****/
  2173.     for( i=0; i<numTicks; i++ )
  2174.     {    theTicks = TickCount() + 1;            // one tick
  2175.         
  2176.         for( colorIndex=0; colorIndex<256; colorIndex++ )
  2177.         {    // make the source more and more like the dest
  2178.             (**srcTab).ctTable[colorIndex].rgb.red -= 
  2179.                       redDelta[colorIndex];
  2180.             (**srcTab).ctTable[colorIndex].rgb.green -= 
  2181.                     greenDelta[colorIndex];
  2182.             (**srcTab).ctTable[colorIndex].rgb.blue -= 
  2183.                      blueDelta[colorIndex];
  2184.         }
  2185.         
  2186.         SetEntries( 0, 255, (ColorSpec *)&(**srcTab).ctTable );
  2187.         
  2188.         // wait until the one tick is done
  2189.         while( theTicks > TickCount() )        
  2190.             ;
  2191.     }
  2192.     
  2193.     // set it to the dest, just in case
  2194.     SetEntries( 0, 255, (ColorSpec *)&(**destTab).ctTable );    
  2195.     MakeITable( nil, nil, 0 );
  2196.     
  2197.     SetGDevice( oldGDevice );    // return it back to itUs old state
  2198. }
  2199.  
  2200. Obviously, unix doesn't know what the apostrophe character Mac used was.
  2201.  
  2202. -Ken-
  2203.  
  2204. +++++++++++++++++++++++++++
  2205.  
  2206. >From ivan_cavero-belaunde@avid.com (Ivan Cavero Belaznde)
  2207. Date: 2 Feb 1995 15:22:50 GMT
  2208. Organization: Avid Technology, Inc.
  2209.  
  2210. In article <1995Jan30.101807.8127@jarvis.cs.toronto.edu>,
  2211. arisz@hub.toronto.edu (Aris Zakinthinos) wrote:
  2212.  
  2213. > In an application I am working on I have a slide show.  I fade the screen
  2214. > to black then fade it back with the first picture.  What I think would be
  2215. > really cool is if the picture faded out and the next picture faded in.  I
  2216. > don't want to fade the whole screen because there is writting on the
  2217. > screen.  I thought the best way would be to have the picture have its own
  2218. > GDevice then fade the GDevice the same way I fade the screen.  But I am
  2219. > not sure this will work or even how to do it.  Any help would be
  2220. > appreciated.
  2221.  
  2222. You cannot do that (have the picture have its own gdevice). I'd advise you
  2223. to fade the entire screen using the gamma-fading code available on various
  2224. places (Apple Dev CDs, alt.source.mac archive, etc). If you insist you
  2225. don't want to do that, then the alternative is to continuously use
  2226. CopyBits with blendMode instead of srcCopy and the opcolor set to the
  2227. blend percentage (red=green=blue=0xffff is opaque, red=green=blue=0x0000
  2228. is transparent). Do note that either you'll have to do the mix operation
  2229. onto an offscreen and then blit, or use progressive mixing (do, say, eight
  2230. passes in your loop with the blend mode set to a nonlinear values - the
  2231. first pass mixes in 1/8th, the second 1/7th, the third 1/6th, etc). The
  2232. second approach might cause objectionalble banding depending on the
  2233. contents of your image (because you're quantizing the new image to some
  2234. percentage of its original level and doing repeated mixing of it).
  2235.  
  2236. HTH,
  2237.  
  2238. -Ivan
  2239. - ---
  2240. Ivan Cavero Belaznde (ivan_cavero-belaunde@avid.com, ivanski@world.std.com)
  2241. Avid VideoShop Project Lead
  2242. Avid Technology, Inc.
  2243. Disclaimer: These opinions are MINE! ALL MINE! MINEMINEMINE! HAHAHA!
  2244.  
  2245. +++++++++++++++++++++++++++
  2246.  
  2247. >From tyger@halcyon.com (Christopher Todd)
  2248. Date: 4 Feb 1995 01:29:45 GMT
  2249. Organization: Northwest Nexus Inc.
  2250.  
  2251.  
  2252. > In article <1995Jan30.101807.8127@jarvis.cs.toronto.edu>,
  2253. > arisz@hub.toronto.edu (Aris Zakinthinos) wrote:
  2254. > > In an application I am working on I have a slide show.  I fade the screen
  2255. > > to black then fade it back with the first picture.  What I think would be
  2256. > > really cool is if the picture faded out and the next picture faded in.  I
  2257. > > don't want to fade the whole screen because there is writting on the
  2258. > > screen.  I thought the best way would be to have the picture have its own
  2259. > > GDevice then fade the GDevice the same way I fade the screen.  But I am
  2260. > > not sure this will work or even how to do it.  Any help would be
  2261. > > appreciated.
  2262. > You cannot do that (have the picture have its own gdevice). I'd advise you
  2263. > to fade the entire screen using the gamma-fading code available on various
  2264. > places (Apple Dev CDs, alt.source.mac archive, etc).
  2265.  
  2266. Actully, I'm not sure if the gamma fade stuff is the same as the things I
  2267. have, but, the source I've got fades the pallette, using setentry and what
  2268. not...what I would do, is take a color entry in the pallete, and use that
  2269. for the text or what ever color (like if you're drawing in white on a
  2270. black background, and then fade the rest of the pallette, excluding the
  2271. color you using to display....
  2272.    or if there are a bunch of things you want to use, assign like 16 or
  2273. pallette entries, and make sure the pictures don't have those colors in
  2274. them, then fade all the colors that aren't those 16 or so... that way,
  2275. only the things with the colors you want to fade will fade, and the others
  2276. will stay bright and clear....
  2277.  
  2278. -- 
  2279. tyger@halcyon.com         \   /-         | \
  2280.                            \ /           |
  2281.                              |            \
  2282.                              \             |
  2283.                               \_         _/      Tora
  2284.  
  2285. +++++++++++++++++++++++++++
  2286.  
  2287. >From kenlong@netcom.com (Ken Long)
  2288. Date: Sat, 4 Feb 1995 18:27:58 GMT
  2289. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2290.  
  2291. I've seen about boxes where only part of the box is faded in and out, 
  2292. with the desktop colors surrounding the dialog remaining intact, as well 
  2293. as the rest of the dialog.
  2294.  
  2295. Metrowerks C about bow fades in scrolling text which fades in as it rises 
  2296. (credits).  So the idea that the whole screen needs done is in error.
  2297.  
  2298. I believe the trick is to use the system colors, and never use any R, G, 
  2299. or B values other than those.  In other words, use only 4096 steps and 
  2300. nothing in between.
  2301.  
  2302. 256 divided by 4096 is 16.  So if the red and/or green and/or blue is 
  2303. incremented or decremented by 4096, then there are 16 levels for each hue.
  2304.  
  2305. If a picture is in a rect, the pixels are of various values.  If you want 
  2306. to fade that rect to black, why couldn't you decrement the RGB values of 
  2307. all the pixels 4096 at a time to 0?
  2308.  
  2309. If it's 65535, 0, 0 then dropping the 65535 to 61439, 57343, 53247, etc, 
  2310. would fade the red to black.
  2311.  
  2312. Conversely, if the rect is now black, and you wanted to fade in a picure, 
  2313. you'd need to find the values of the pictures RGB and "morph" it in by 
  2314. only increasing the RGB for that rect by appropriate amounts until an 
  2315. equalization occurred.
  2316.  
  2317. It's like a progress bar.  The total change needed gets calculated, then 
  2318. change begins, then progress of change is reported until "changed" equals 
  2319. "total change".
  2320.  
  2321. Maybe RGB value could be incremented or decremented during a refresh - I 
  2322. don't know.
  2323.  
  2324. In a color paint program, if you fill a blue area with a blue that's 4096 
  2325. darker, aen't you "fading" that portion of the pict toward black, using 
  2326. the System palette, and without doing the whole screen?
  2327.  
  2328. Some creative hacking could do it for a portion of a windows content.  
  2329. It's not that it "can't be done" - it has been done.  I've seen it in action.
  2330.  
  2331. making the code necessary to do it freely available?  That's what hasn't 
  2332. been done (although it could be done).
  2333.  
  2334. -Ken-
  2335.  
  2336. +++++++++++++++++++++++++++
  2337.  
  2338. >From walky@srv.net (Alan Walkington)
  2339. Date: Tue, 07 Feb 1995 17:46:09 -0700
  2340. Organization: HyperK a Division of Scientech, Inc.
  2341.  
  2342. In article <kenlongD3HnAM.FsD@netcom.com>, kenlong@netcom.com (Ken Long) wrote:
  2343.  
  2344. > I've seen about boxes where only part of the box is faded in and out, 
  2345. > with the desktop colors surrounding the dialog remaining intact, as well 
  2346. > as the rest of the dialog.
  2347. > Metrowerks C about box fades in scrolling text which fades in as it rises 
  2348. > (credits).  So the idea that the whole screen needs done is in error.
  2349.  
  2350. < comments deleted >
  2351.  
  2352. The CW about box code is on the distribution CD ...
  2353. Maybe we can see how they did it?
  2354.  
  2355. -- 
  2356. Alan Walkington
  2357. walky@srv.net
  2358.  
  2359. ---------------------------
  2360.  
  2361. End of C.S.M.P. Digest
  2362. **********************
  2363.  
  2364.  
  2365.  
  2366. Attachment converted: Spiff:Pict2PPat.c (TEXT/MMCC) (000159F8)
  2367.